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