예제 #1
0
        private void EnqueueSlow(T item, ref SingleProducerSingleConsumerQueue <T> .Segment segment)
        {
            if (segment.m_state.m_firstCopy != segment.m_state.m_first)
            {
                segment.m_state.m_firstCopy = segment.m_state.m_first;
                this.Enqueue(item);
            }
            else
            {
                int size = this.m_tail.m_array.Length << 1;
                if (size > 16777216)
                {
                    size = 16777216;
                }
                SingleProducerSingleConsumerQueue <T> .Segment segment1 = new SingleProducerSingleConsumerQueue <T> .Segment(size);

                segment1.m_array[0]         = item;
                segment1.m_state.m_last     = 1;
                segment1.m_state.m_lastCopy = 1;
                try
                {
                }
                finally
                {
                    Volatile.Write <SingleProducerSingleConsumerQueue <T> .Segment>(ref this.m_tail.m_next, segment1);
                    this.m_tail = segment1;
                }
            }
        }
예제 #2
0
 private bool TryDequeueSlow(ref SingleProducerSingleConsumerQueue <T> .Segment segment, ref T[] array, out T result)
 {
     if (segment.m_state.m_last != segment.m_state.m_lastCopy)
     {
         segment.m_state.m_lastCopy = segment.m_state.m_last;
         return(this.TryDequeue(out result));
     }
     if (segment.m_next != null && segment.m_state.m_first == segment.m_state.m_last)
     {
         // ISSUE: explicit reference operation
         // ISSUE: variable of a reference type
         SingleProducerSingleConsumerQueue <T> .Segment& local = @segment;
         // ISSUE: explicit reference operation
         SingleProducerSingleConsumerQueue <T> .Segment segment1 = (^ local).m_next;
예제 #3
0
        public bool TryDequeue(out T result)
        {
            SingleProducerSingleConsumerQueue <T> .Segment segment = this.m_head;
            T[] array = segment.m_array;
            int index = segment.m_state.m_first;

            if (index == segment.m_state.m_lastCopy)
            {
                return(this.TryDequeueSlow(ref segment, ref array, out result));
            }
            result                  = array[index];
            array[index]            = default(T);
            segment.m_state.m_first = index + 1 & array.Length - 1;
            return(true);
        }
예제 #4
0
        public void Enqueue(T item)
        {
            SingleProducerSingleConsumerQueue <T> .Segment segment = this.m_tail;
            T[] objArray = segment.m_array;
            int index    = segment.m_state.m_last;
            int num      = index + 1 & objArray.Length - 1;

            if (num != segment.m_state.m_firstCopy)
            {
                objArray[index]        = item;
                segment.m_state.m_last = num;
            }
            else
            {
                this.EnqueueSlow(item, ref segment);
            }
        }
            // Token: 0x06006EE3 RID: 28387 RVA: 0x0017DBAC File Offset: 0x0017BDAC
            internal ConcurrentExclusiveTaskScheduler(ConcurrentExclusiveSchedulerPair pair, int maxConcurrencyLevel, ConcurrentExclusiveSchedulerPair.ProcessingMode processingMode)
            {
                this.m_pair = pair;
                this.m_maxConcurrencyLevel = maxConcurrencyLevel;
                this.m_processingMode      = processingMode;
                IProducerConsumerQueue <Task> tasks;

                if (processingMode != ConcurrentExclusiveSchedulerPair.ProcessingMode.ProcessingExclusiveTask)
                {
                    IProducerConsumerQueue <Task> producerConsumerQueue = new MultiProducerMultiConsumerQueue <Task>();
                    tasks = producerConsumerQueue;
                }
                else
                {
                    IProducerConsumerQueue <Task> producerConsumerQueue = new SingleProducerSingleConsumerQueue <Task>();
                    tasks = producerConsumerQueue;
                }
                this.m_tasks = tasks;
            }
예제 #6
0
 /// <summary>Initializes the debug view.</summary>
 /// <param name="queue">The queue being debugged.</param>
 public SingleProducerSingleConsumerQueue_DebugView(SingleProducerSingleConsumerQueue <T> queue)
 {
     Debug.Assert(queue != null, "Expected a non-null queue.");
     _queue = queue;
 }
 /// <summary>Initializes the debug view.</summary>
 /// <param name="enumerable">The queue being debugged.</param>
 public SingleProducerSingleConsumerQueue_DebugView(SingleProducerSingleConsumerQueue <T> queue)
 {
     Contract.Requires(queue != null, "Expected a non-null queue.");
     m_queue = queue;
 }
예제 #8
0
 internal SingleProducerSingleConsumerQueue()
 {
     this.m_head = this.m_tail = new SingleProducerSingleConsumerQueue <T> .Segment(32);
 }