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; } } }
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;
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); }
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; }
/// <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; }
internal SingleProducerSingleConsumerQueue() { this.m_head = this.m_tail = new SingleProducerSingleConsumerQueue <T> .Segment(32); }