示例#1
0
        public ThreadPoolWorkQueue()
        {
            queueTail = queueHead = new QueueSegment();
#if !FEATURE_CORECLR
            //loggingEnabled = System.Diagnostics.Tracing.FrameworkEventSource.Log.IsEnabled(System.Diagnostics.Tracing.EventLevel.Verbose, System.Diagnostics.Tracing.FrameworkEventSource.Keywords.ThreadPool);
#endif
        }
示例#2
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();
        }
示例#3
0
        public void Dequeue(ThreadPoolWorkQueueThreadLocals tl, out IThreadPoolWorkItem callback, out bool missedSteal)
        {
            callback    = null;
            missedSteal = false;
            WorkStealingQueue workStealingQueue = tl.workStealingQueue;

            workStealingQueue.LocalPop(out callback);
            if (callback == null)
            {
                for (QueueSegment segment = this.queueTail; (!segment.TryDequeue(out callback) && (segment.Next != null)) && segment.IsUsedUp(); segment = this.queueTail)
                {
                    Interlocked.CompareExchange <QueueSegment>(ref this.queueTail, segment.Next, segment);
                }
            }
            if (callback == null)
            {
                WorkStealingQueue[] current = allThreadQueues.Current;
                int num = tl.random.Next(current.Length);
                for (int i = current.Length; i > 0; i--)
                {
                    WorkStealingQueue queue2 = current[num % current.Length];
                    if (((queue2 != null) && (queue2 != workStealingQueue)) && queue2.TrySteal(out callback, ref missedSteal))
                    {
                        return;
                    }
                    num++;
                }
            }
        }
示例#4
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();
        }
示例#5
0
        public void Dequeue(ThreadPoolWorkQueueThreadLocals tl, out IThreadPoolWorkItem callback, out bool missedSteal)
        {
            callback    = null;
            missedSteal = false;
            WorkStealingQueue wsq = tl.workStealingQueue;

            if (wsq.LocalPop(out callback))
            {
                Debug.Assert(null != callback);
            }

            if (null == callback)
            {
                QueueSegment tail = queueTail;
                while (true)
                {
                    if (tail.TryDequeue(out callback))
                    {
                        Debug.Assert(null != callback);
                        break;
                    }

                    if (null == tail.Next || !tail.IsUsedUp())
                    {
                        break;
                    }
                    else
                    {
                        Interlocked.CompareExchange(ref queueTail, tail.Next, tail);
                        tail = queueTail;
                    }
                }
            }

            if (null == callback)
            {
                WorkStealingQueue[] otherQueues = allThreadQueues.Current;
                int i = tl.random.Next(otherQueues.Length);
                int c = otherQueues.Length;
                while (c > 0)
                {
                    WorkStealingQueue otherQueue = Volatile.Read(ref otherQueues[i % otherQueues.Length]);
                    if (otherQueue != null &&
                        otherQueue != wsq &&
                        otherQueue.TrySteal(out callback, ref missedSteal))
                    {
                        Debug.Assert(null != callback);
                        break;
                    }
                    i++;
                    c--;
                }
            }
        }
示例#6
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();
        }
示例#7
0
 public ThreadPoolWorkQueue()
 {
     queueTail = queueHead = new QueueSegment();
 }
 public ThreadPoolWorkQueue(int queueMissUpperLimit)
 {
     QueueMissUpperLimit = queueMissUpperLimit;
     queueTail           = queueHead = new QueueSegment();
 }