Exemple #1
0
        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();
        }
Exemple #2
0
        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();
        }
Exemple #3
0
        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();
        }