Skip to content

Commit 6bb188c

Browse files
committed
Simplify Scope ctor
1 parent cdcb3be commit 6bb188c

File tree

2 files changed

+42
-35
lines changed

2 files changed

+42
-35
lines changed

src/DotNext.Threading/Threading/CancellationTokenMultiplexer.Scope.cs

Lines changed: 8 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,39 +22,13 @@ partial class CancellationTokenMultiplexer
2222

2323
internal Scope(CancellationTokenMultiplexer multiplexer, ReadOnlySpan<CancellationToken> tokens)
2424
{
25-
switch (tokens)
26-
{
27-
case []:
28-
source = null;
29-
multiplexerOrToken = InlineToken(new(canceled: false));
30-
break;
31-
case [var token]:
32-
source = null;
33-
multiplexerOrToken = InlineToken(token);
34-
break;
35-
case [var token1, var token2]:
36-
source = null;
37-
if (!token1.CanBeCanceled || token1 == token2)
38-
{
39-
multiplexerOrToken = InlineToken(token2);
40-
}
41-
else if (!token2.CanBeCanceled)
42-
{
43-
multiplexerOrToken = InlineToken(token1);
44-
}
45-
else
46-
{
47-
goto default;
48-
}
49-
50-
break;
51-
default:
52-
multiplexerOrToken = new(multiplexer);
53-
source = multiplexer.Rent(tokens);
54-
break;
55-
}
25+
multiplexerOrToken = new(multiplexer);
26+
source = multiplexer.Rent(tokens);
5627
}
5728

29+
internal Scope(CancellationToken token)
30+
=> multiplexerOrToken = InlineToken(token);
31+
5832
private static ValueTuple<object> InlineToken(CancellationToken token)
5933
=> CanInlineToken ? Unsafe.BitCast<CancellationToken, ValueTuple<object>>(token) : new(token);
6034

@@ -79,11 +53,11 @@ private static CancellationToken GetToken(ValueTuple<object> value)
7953
/// <inheritdoc/>
8054
public void Dispose()
8155
{
82-
if (source?.Count is { } count)
56+
if (source is not null)
8357
{
8458
Debug.Assert(multiplexerOrToken.Item1 is CancellationTokenMultiplexer);
8559

86-
for (var i = 0; i < count; i++)
60+
for (var i = 0; i < source.Count; i++)
8761
{
8862
source[i].Dispose();
8963
}
@@ -101,7 +75,7 @@ public ValueTask DisposeAsync()
10175

10276
private static async ValueTask ReturnAsync(CancellationTokenMultiplexer multiplexer, PooledCancellationTokenSource source)
10377
{
104-
for (int i = 0, count = source.Count; i < count; i++)
78+
for (var i = 0; i < source.Count; i++)
10579
{
10680
await source[i].DisposeAsync().ConfigureAwait(false);
10781
}

src/DotNext.Threading/Threading/CancellationTokenMultiplexer.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,38 @@ public int MaximumRetained
3030
/// <param name="tokens">The tokens to be combined.</param>
3131
/// <returns>The scope that contains a single multiplexed token.</returns>
3232
public Scope Combine(ReadOnlySpan<CancellationToken> tokens) // TODO: use params
33-
=> new(this, tokens);
33+
{
34+
Scope scope;
35+
switch (tokens)
36+
{
37+
case []:
38+
scope = new();
39+
break;
40+
case [var token]:
41+
scope = new(token);
42+
break;
43+
case [var token1, var token2]:
44+
if (!token1.CanBeCanceled || token1 == token2)
45+
{
46+
scope = new(token2);
47+
}
48+
else if (!token2.CanBeCanceled)
49+
{
50+
scope = new(token1);
51+
}
52+
else
53+
{
54+
goto default;
55+
}
56+
57+
break;
58+
default:
59+
scope = new(this, tokens);
60+
break;
61+
}
62+
63+
return scope;
64+
}
3465

3566
private void Return(PooledCancellationTokenSource source)
3667
{
@@ -88,6 +119,8 @@ private PooledCancellationTokenSource Rent(ReadOnlySpan<CancellationToken> token
88119
Debug.Assert(source.Count is 0);
89120

90121
source.AddRange(tokens);
122+
Debug.Assert(source.Count == tokens.Length);
123+
91124
return source;
92125
}
93126
}

0 commit comments

Comments
 (0)