You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
using System; |
|
using System.Runtime.CompilerServices; |
|
|
|
namespace Cysharp.Threading.Tasks.Internal |
|
{ |
|
internal sealed class PooledDelegate<T> : ITaskPoolNode<PooledDelegate<T>> |
|
{ |
|
static TaskPool<PooledDelegate<T>> pool; |
|
|
|
PooledDelegate<T> nextNode; |
|
public ref PooledDelegate<T> NextNode => ref nextNode; |
|
|
|
static PooledDelegate() |
|
{ |
|
TaskPool.RegisterSizeGetter(typeof(PooledDelegate<T>), () => pool.Size); |
|
} |
|
|
|
readonly Action<T> runDelegate; |
|
Action continuation; |
|
|
|
PooledDelegate() |
|
{ |
|
runDelegate = Run; |
|
} |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
public static Action<T> Create(Action continuation) |
|
{ |
|
if (!pool.TryPop(out var item)) |
|
{ |
|
item = new PooledDelegate<T>(); |
|
} |
|
|
|
item.continuation = continuation; |
|
return item.runDelegate; |
|
} |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
void Run(T _) |
|
{ |
|
var call = continuation; |
|
continuation = null; |
|
if (call != null) |
|
{ |
|
pool.TryPush(this); |
|
call.Invoke(); |
|
} |
|
} |
|
} |
|
} |