public void Enqueue(IThreadPoolWorkItem callback, bool forceGlobal) { ThreadPoolWorkQueueThreadLocals tl = null; if (!forceGlobal) { tl = ThreadPoolWorkQueueThreadLocals.Current; } if (null != tl) { tl.workStealingQueue.LocalPush(callback); } else { QueueSegment head = queueHead; while (!head.TryEnqueue(callback)) { Interlocked.CompareExchange(ref head.Next, new QueueSegment(), null); while (head.Next != null) { Interlocked.CompareExchange(ref queueHead, head.Next, head); head = queueHead; } } } EnsureThreadRequested(); }
public void Enqueue(IThreadPoolWorkItem callback, bool forceGlobal) { ThreadPoolWorkQueueThreadLocals threadLocals = null; if (!forceGlobal) { threadLocals = ThreadPoolWorkQueueThreadLocals.threadLocals; } if (threadLocals != null) { threadLocals.workStealingQueue.LocalPush(callback); } else { QueueSegment queueHead = this.queueHead; while (!queueHead.TryEnqueue(callback)) { Interlocked.CompareExchange <QueueSegment>(ref queueHead.Next, new QueueSegment(), null); while (queueHead.Next != null) { Interlocked.CompareExchange <QueueSegment>(ref this.queueHead, queueHead.Next, queueHead); queueHead = this.queueHead; } } } this.EnsureThreadRequested(); }
public void Enqueue(IThreadPoolWorkItem callback, bool forceGlobal) { ThreadPoolWorkQueueThreadLocals tl = null; if (!forceGlobal) { tl = ThreadPoolWorkQueueThreadLocals.Current; } #if !FEATURE_CORECLR //if (loggingEnabled) // System.Diagnostics.Tracing.FrameworkEventSource.Log.ThreadPoolEnqueueWorkObject(callback); #endif if (null != tl) { tl.workStealingQueue.LocalPush(callback); } else { QueueSegment head = queueHead; while (!head.TryEnqueue(callback)) { Interlocked.CompareExchange(ref head.Next, new QueueSegment(), null); while (head.Next != null) { Interlocked.CompareExchange(ref queueHead, head.Next, head); head = queueHead; } } } EnsureThreadRequested(); }