Skip to content

Commit 125cea6

Browse files
committed
Add InterlockedReference<T>
1 parent 19b2176 commit 125cea6

File tree

9 files changed

+236
-0
lines changed

9 files changed

+236
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
- Two new boolean properties in `AsyncHostedService` lets subclasses decide whether `StartAsync` should fail when the service is stopped before starting (`FailOnSetupNotStarted`) or `SetupAsync` completes with `false` (`FailOnSetupUnsuccessful`).
2222
The default value is `true` for both properties.
2323
- Struct `Louis.Threading.InterlockedFlag` now implements `IEquatable<bool>`, as well as equality and inequality operators with `bool`.
24+
- New struct `Louis.Threading.InterlockedReference<T>` encapsulates an object reference, so that it is always accessed in a thread-safe fashion.
2425

2526
### Changes to existing features
2627

src/Louis/PublicAPI/net462/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1414
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1515
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
17+
Louis.Threading.InterlockedReference<T>
18+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
19+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
20+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
22+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
24+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
25+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
26+
Louis.Threading.InterlockedReference<T>.Value.set -> void
27+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
28+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
29+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1730
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
1831
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
32+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
33+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
34+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
1936
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2037
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/net47/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1414
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1515
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
17+
Louis.Threading.InterlockedReference<T>
18+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
19+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
20+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
22+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
24+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
25+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
26+
Louis.Threading.InterlockedReference<T>.Value.set -> void
27+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
28+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
29+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1730
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
1831
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
32+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
33+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
34+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
1936
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2037
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/net6.0/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1414
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1515
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
17+
Louis.Threading.InterlockedReference<T>
18+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
19+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
20+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
22+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
24+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
25+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
26+
Louis.Threading.InterlockedReference<T>.Value.set -> void
27+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
28+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
29+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1730
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
1831
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
32+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
33+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
34+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
1936
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2037
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/net7.0/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,26 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1515
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1717
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
18+
Louis.Threading.InterlockedReference<T>
19+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
20+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
22+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
24+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
25+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
26+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
27+
Louis.Threading.InterlockedReference<T>.Value.set -> void
28+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
29+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
30+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1831
static Louis.ComponentModel.SimpleStringConverter.AddToTypeDescriptor<T>() -> void
1932
Louis.Threading.AsyncService.StopAndWaitAsync() -> System.Threading.Tasks.Task<bool>!
2033
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
2134
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
36+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
37+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
38+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
2239
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2340
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/net8.0/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,26 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1515
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1717
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
18+
Louis.Threading.InterlockedReference<T>
19+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
20+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
22+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
24+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
25+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
26+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
27+
Louis.Threading.InterlockedReference<T>.Value.set -> void
28+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
29+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
30+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1831
static Louis.ComponentModel.SimpleStringConverter.AddToTypeDescriptor<T>() -> void
1932
Louis.Threading.AsyncService.StopAndWaitAsync() -> System.Threading.Tasks.Task<bool>!
2033
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
2134
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
36+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
37+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
38+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
2239
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2340
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1414
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1515
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
17+
Louis.Threading.InterlockedReference<T>
18+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
19+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
20+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
22+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
24+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
25+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
26+
Louis.Threading.InterlockedReference<T>.Value.set -> void
27+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
28+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
29+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1730
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
1831
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
32+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
33+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
34+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
1936
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2037
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

src/Louis/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,24 @@ Louis.Threading.AsyncServiceSetupResult.NotStarted = 1 -> Louis.Threading.AsyncS
1414
Louis.Threading.AsyncServiceSetupResult.Successful = 0 -> Louis.Threading.AsyncServiceSetupResult
1515
Louis.Threading.AsyncServiceSetupResult.Unsuccessful = 2 -> Louis.Threading.AsyncServiceSetupResult
1616
Louis.Threading.InterlockedFlag.Equals(bool other) -> bool
17+
Louis.Threading.InterlockedReference<T>
18+
Louis.Threading.InterlockedReference<T>.CompareExchange(T? value, T? comparand) -> T?
19+
Louis.Threading.InterlockedReference<T>.Equals(Louis.Threading.InterlockedReference<T!> other) -> bool
20+
Louis.Threading.InterlockedReference<T>.Equals(T? other) -> bool
21+
Louis.Threading.InterlockedReference<T>.Exchange(T? value) -> T?
22+
Louis.Threading.InterlockedReference<T>.InterlockedReference() -> void
23+
Louis.Threading.InterlockedReference<T>.InterlockedReference(T? value) -> void
24+
Louis.Threading.InterlockedReference<T>.IsNull.get -> bool
25+
Louis.Threading.InterlockedReference<T>.Value.get -> T?
26+
Louis.Threading.InterlockedReference<T>.Value.set -> void
27+
override Louis.Threading.InterlockedReference<T>.Equals(object? obj) -> bool
28+
override Louis.Threading.InterlockedReference<T>.GetHashCode() -> int
29+
override Louis.Threading.InterlockedReference<T>.ToString() -> string!
1730
static Louis.Threading.InterlockedFlag.operator !=(Louis.Threading.InterlockedFlag a, bool b) -> bool
1831
static Louis.Threading.InterlockedFlag.operator ==(Louis.Threading.InterlockedFlag a, bool b) -> bool
32+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
33+
static Louis.Threading.InterlockedReference<T>.operator !=(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
34+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, Louis.Threading.InterlockedReference<T!> b) -> bool
35+
static Louis.Threading.InterlockedReference<T>.operator ==(Louis.Threading.InterlockedReference<T!> a, T? b) -> bool
1936
virtual Louis.Threading.AsyncService.LogSetupCompleted(bool success) -> void
2037
virtual Louis.Threading.AsyncService.SetupAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<bool>

0 commit comments

Comments
 (0)