1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- 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();
- }
- }
- }
- }
|