@@ -156,7 +156,7 @@ private TNode EnqueueNode<TNode, TInitializer>(ref ValueTaskPool<bool, TNode, Ac
156
156
private protected TNode EnqueueNode < TNode , TLockManager > ( ref ValueTaskPool < bool , TNode , Action < TNode > > pool , WaitNodeFlags flags )
157
157
where TNode : WaitNode , IPooledManualResetCompletionSource < Action < TNode > > , new ( )
158
158
where TLockManager : struct , ILockManager < TNode >
159
- => EnqueueNode < TNode , NodeInitializer < TNode , TLockManager > > ( ref pool , new ( flags ) ) ;
159
+ => EnqueueNode < TNode , StaticInitializer < TNode , TLockManager > > ( ref pool , new ( flags ) ) ;
160
160
161
161
private protected bool TryAcquire < TLockManager > ( ref TLockManager manager )
162
162
where TLockManager : struct , ILockManager
@@ -252,7 +252,7 @@ private protected ValueTask AcquireAsync<TNode, TLockManager, TOptions>(ref Valu
252
252
where TNode : WaitNode , IPooledManualResetCompletionSource < Action < TNode > > , new ( )
253
253
where TLockManager : struct , ILockManager < TNode >
254
254
where TOptions : struct , IAcquisitionOptions
255
- => AcquireAsync < ValueTask , TNode , NodeInitializer < TNode , TLockManager > , TLockManager , TOptions > (
255
+ => AcquireAsync < ValueTask , TNode , StaticInitializer < TNode , TLockManager > , TLockManager , TOptions > (
256
256
ref pool ,
257
257
ref manager ,
258
258
new ( WaitNodeFlags . ThrowOnTimeout ) ,
@@ -263,32 +263,21 @@ private protected ValueTask<bool> TryAcquireAsync<TNode, TLockManager, TOptions>
263
263
where TNode : WaitNode , IPooledManualResetCompletionSource < Action < TNode > > , new ( )
264
264
where TLockManager : struct , ILockManager < TNode >
265
265
where TOptions : struct , IAcquisitionOptions
266
- => AcquireAsync < ValueTask < bool > , TNode , NodeInitializer < TNode , TLockManager > , TLockManager , TOptions > (
266
+ => AcquireAsync < ValueTask < bool > , TNode , StaticInitializer < TNode , TLockManager > , TLockManager , TOptions > (
267
267
ref pool ,
268
268
ref manager ,
269
269
new ( WaitNodeFlags . None ) ,
270
270
options ) ;
271
271
272
- private protected ValueTask AcquireAsync < TNode , TArg , TLockManager , TOptions > ( ref ValueTaskPool < bool , TNode , Action < TNode > > pool ,
273
- ref TLockManager manager , TArg arg , TOptions options )
274
- where TNode : WaitNode , IPooledManualResetCompletionSource < Action < TNode > > , new ( )
275
- where TLockManager : struct , ILockManager < TNode , TArg >
276
- where TOptions : struct , IAcquisitionOptions
277
- => AcquireAsync < ValueTask , TNode , NodeInitializer < TNode , TArg , TLockManager > , TLockManager , TOptions > (
278
- ref pool ,
279
- ref manager ,
280
- new ( WaitNodeFlags . ThrowOnTimeout , arg ) ,
281
- options ) ;
282
-
283
- private protected ValueTask < bool > TryAcquireAsync < TNode , TArg , TLockManager , TOptions > ( ref ValueTaskPool < bool , TNode , Action < TNode > > pool ,
284
- ref TLockManager manager , TArg arg , TOptions options )
272
+ private protected ValueTask AcquireSpecialAsync < TNode , TLockManager , TOptions > ( ref ValueTaskPool < bool , TNode , Action < TNode > > pool ,
273
+ ref TLockManager manager , TOptions options )
285
274
where TNode : WaitNode , IPooledManualResetCompletionSource < Action < TNode > > , new ( )
286
- where TLockManager : struct , ILockManager < TNode , TArg >
275
+ where TLockManager : struct , ILockManager , IConsumer < TNode >
287
276
where TOptions : struct , IAcquisitionOptions
288
- => AcquireAsync < ValueTask < bool > , TNode , NodeInitializer < TNode , TArg , TLockManager > , TLockManager , TOptions > (
277
+ => AcquireAsync < ValueTask , TNode , NodeInitializer < TNode , TLockManager > , TLockManager , TOptions > (
289
278
ref pool ,
290
279
ref manager ,
291
- new ( WaitNodeFlags . None , arg ) ,
280
+ new ( WaitNodeFlags . ThrowOnTimeout , ref manager ) ,
292
281
options ) ;
293
282
294
283
/// <summary>
@@ -458,7 +447,7 @@ private interface INodeInitializer<in TNode> : IConsumer<TNode>
458
447
}
459
448
460
449
[ StructLayout ( LayoutKind . Auto ) ]
461
- private readonly struct NodeInitializer < TNode , TLockManager > ( WaitNodeFlags flags ) : INodeInitializer < TNode >
450
+ private readonly struct StaticInitializer < TNode , TLockManager > ( WaitNodeFlags flags ) : INodeInitializer < TNode >
462
451
where TNode : WaitNode
463
452
where TLockManager : struct , ILockManager < TNode >
464
453
{
@@ -467,14 +456,18 @@ private readonly struct NodeInitializer<TNode, TLockManager>(WaitNodeFlags flags
467
456
void IConsumer < TNode > . Invoke ( TNode node ) => TLockManager . InitializeNode ( node ) ;
468
457
}
469
458
459
+ // TODO: Replace with allows ref anti-constraint and ref struct
470
460
[ StructLayout ( LayoutKind . Auto ) ]
471
- private readonly struct NodeInitializer < TNode , TArg , TLockManager > ( WaitNodeFlags flags , TArg arg ) : INodeInitializer < TNode >
461
+ private readonly struct NodeInitializer < TNode , TLockManager > ( WaitNodeFlags flags , ref TLockManager manager ) : INodeInitializer < TNode >
472
462
where TNode : WaitNode
473
- where TLockManager : struct , ILockManager < TNode , TArg >
463
+ where TLockManager : struct , ILockManager , IConsumer < TNode >
474
464
{
465
+ private readonly unsafe void * managerOnStack = Unsafe . AsPointer ( ref manager ) ;
466
+
475
467
WaitNodeFlags INodeInitializer < TNode > . Flags => flags ;
476
468
477
- void IConsumer < TNode > . Invoke ( TNode node ) => TLockManager . InitializeNode ( node , arg ) ;
469
+ unsafe void IConsumer < TNode > . Invoke ( TNode node )
470
+ => Unsafe . AsRef < TLockManager > ( managerOnStack ) . Invoke ( node ) ;
478
471
}
479
472
480
473
private interface IValueTaskFactory < out T > : ISupplier < TimeSpan , CancellationToken , T >
@@ -574,12 +567,6 @@ static virtual void InitializeNode(TNode node)
574
567
{
575
568
}
576
569
}
577
-
578
- private protected interface ILockManager < in TNode , in TArg > : ILockManager
579
- where TNode : WaitNode
580
- {
581
- static abstract void InitializeNode ( TNode node , TArg arg ) ;
582
- }
583
570
584
571
/// <summary>
585
572
/// Represents acquisition options.
0 commit comments