Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
BlockingCollection.cs
Go to the documentation of this file.
7
9
10[UnsupportedOSPlatform("browser")]
12[DebuggerDisplay("Count = {Count}, Type = {_collection}")]
14{
16
17 private int _boundedCapacity;
18
20
22
23 private bool _isDisposed;
24
26
28
29 private volatile int _currentAdders;
30
31 public int BoundedCapacity
32 {
33 get
34 {
36 return _boundedCapacity;
37 }
38 }
39
41 {
42 get
43 {
45 return _currentAdders == int.MinValue;
46 }
47 }
48
49 public bool IsCompleted
50 {
51 get
52 {
55 {
56 return _occupiedNodes.CurrentCount == 0;
57 }
58 return false;
59 }
60 }
61
62 public int Count
63 {
64 get
65 {
68 }
69 }
70
71 bool ICollection.IsSynchronized
72 {
73 get
74 {
76 return false;
77 }
78 }
79
80 object ICollection.SyncRoot
81 {
82 get
83 {
85 }
86 }
87
92
97
115
117 {
118 if (collection == null)
119 {
120 throw new ArgumentNullException("collection");
121 }
122 Initialize(collection, -1, collection.Count);
123 }
124
125 [MemberNotNull("_collection")]
126 [MemberNotNull("_consumersCancellationTokenSource")]
127 [MemberNotNull("_producersCancellationTokenSource")]
128 [MemberNotNull("_occupiedNodes")]
146
147 public void Add(T item)
148 {
150 }
151
156
157 public bool TryAdd(T item)
158 {
160 }
161
162 public bool TryAdd(T item, TimeSpan timeout)
163 {
165 return TryAddWithNoTimeValidation(item, (int)timeout.TotalMilliseconds, CancellationToken.None);
166 }
167
173
179
181 {
183 cancellationToken.ThrowIfCancellationRequested();
185 {
187 }
188 bool flag = true;
189 if (_freeNodes != null)
190 {
192 try
193 {
194 flag = _freeNodes.Wait(0, default(CancellationToken));
195 if (!flag && millisecondsTimeout != 0)
196 {
199 }
200 }
202 {
203 cancellationToken.ThrowIfCancellationRequested();
205 }
206 finally
207 {
208 cancellationTokenSource?.Dispose();
209 }
210 }
211 if (flag)
212 {
213 SpinWait spinWait = default(SpinWait);
214 while (true)
215 {
217 if (((uint)currentAdders & 0x80000000u) != 0)
218 {
219 spinWait.Reset();
220 while (_currentAdders != int.MinValue)
221 {
222 spinWait.SpinOnce();
223 }
225 }
227 {
228 break;
229 }
230 spinWait.SpinOnce(-1);
231 }
232 try
233 {
234 bool flag2 = false;
235 try
236 {
237 cancellationToken.ThrowIfCancellationRequested();
238 flag2 = _collection.TryAdd(item);
239 }
240 catch
241 {
242 if (_freeNodes != null)
243 {
245 }
246 throw;
247 }
248 if (!flag2)
249 {
251 }
253 }
254 finally
255 {
257 }
258 }
259 return flag;
260 }
261
262 public T Take()
263 {
265 {
267 }
268 return item;
269 }
270
279
280 public bool TryTake([MaybeNullWhen(false)] out T item)
281 {
283 }
284
285 public bool TryTake([MaybeNullWhen(false)] out T item, TimeSpan timeout)
286 {
288 return TryTakeWithNoTimeValidation(out item, (int)timeout.TotalMilliseconds, CancellationToken.None, null);
289 }
290
296
302
304 {
306 item = default(T);
307 cancellationToken.ThrowIfCancellationRequested();
308 if (IsCompleted)
309 {
310 return false;
311 }
312 bool flag = false;
314 try
315 {
316 flag = _occupiedNodes.Wait(0);
317 if (!flag && millisecondsTimeout != 0)
318 {
319 if (cancellationTokenSource == null)
320 {
322 }
324 }
325 }
327 {
328 cancellationToken.ThrowIfCancellationRequested();
329 return false;
330 }
331 finally
332 {
333 if (cancellationTokenSource != null && combinedTokenSource == null)
334 {
335 cancellationTokenSource.Dispose();
336 }
337 }
338 if (flag)
339 {
340 bool flag2 = false;
341 bool flag3 = true;
342 try
343 {
344 cancellationToken.ThrowIfCancellationRequested();
345 flag2 = _collection.TryTake(out item);
346 flag3 = false;
347 if (!flag2)
348 {
350 }
351 }
352 finally
353 {
354 if (flag2)
355 {
356 if (_freeNodes != null)
357 {
359 }
360 }
361 else if (flag3)
362 {
364 }
365 if (IsCompleted)
366 {
368 }
369 }
370 }
371 return flag;
372 }
373
375 {
377 }
378
383
388
394
400
406
408 {
410 int num = millisecondsTimeout;
411 uint startTime = 0u;
412 if (millisecondsTimeout != -1)
413 {
415 }
417 if (num2 > -1)
418 {
419 return num2;
420 }
423 while (millisecondsTimeout == -1 || num >= 0)
424 {
425 num2 = -1;
427 {
428 handles.Add(cancellationTokenSource.Token.WaitHandle);
429 num2 = WaitHandle.WaitAny(handles.ToArray(), num);
430 handles.RemoveAt(handles.Count - 1);
431 if (cancellationTokenSource.IsCancellationRequested)
432 {
433 externalCancellationToken.ThrowIfCancellationRequested();
435 }
436 }
437 if (num2 == 258)
438 {
439 return -1;
440 }
442 {
443 return num2;
444 }
445 if (millisecondsTimeout != -1)
446 {
448 }
449 }
450 return -1;
451 }
452
454 {
455 for (int i = 0; i < collections.Length; i++)
456 {
457 if (collections[i]._freeNodes == null)
458 {
460 return i;
461 }
462 }
463 return -1;
464 }
465
467 {
471 if (isAddOperation)
472 {
474 {
475 if (blockingCollection._freeNodes != null)
476 {
477 list.Add(blockingCollection._freeNodes.AvailableWaitHandle);
478 list2.Add(blockingCollection._producersCancellationTokenSource.Token);
479 }
480 }
481 }
482 else
483 {
484 for (int j = 0; j < collections.Length; j++)
485 {
487 {
490 }
491 }
492 }
493 cancellationTokens = list2.ToArray();
494 return list;
495 }
496
498 {
500 {
501 return 0;
502 }
503 uint num = (uint)Environment.TickCount - startTime;
504 if (num > int.MaxValue)
505 {
506 return 0;
507 }
508 int num2 = originalWaitMillisecondsTimeout - (int)num;
509 if (num2 <= 0)
510 {
511 return 0;
512 }
513 return num2;
514 }
515
520
525
527 {
529 }
530
536
542
548
561
563 {
564 int num = millisecondsTimeout;
565 uint startTime = 0u;
566 if (millisecondsTimeout != -1)
567 {
569 }
570 while (millisecondsTimeout == -1 || num >= 0)
571 {
574 if (handles.Count == 0 && isTakeOperation)
575 {
577 }
578 if (handles.Count == 0)
579 {
580 break;
581 }
583 {
584 handles.Add(cancellationTokenSource.Token.WaitHandle);
585 int num2 = WaitHandle.WaitAny(handles.ToArray(), num);
586 if (cancellationTokenSource.IsCancellationRequested)
587 {
588 externalCancellationToken.ThrowIfCancellationRequested();
589 }
590 if (!cancellationTokenSource.IsCancellationRequested)
591 {
592 if (num2 == 258)
593 {
594 break;
595 }
596 if (collections.Length != handles.Count - 1)
597 {
598 for (int i = 0; i < collections.Length; i++)
599 {
601 {
602 num2 = i;
603 break;
604 }
605 }
606 }
608 {
609 return num2;
610 }
611 }
612 }
613 if (millisecondsTimeout != -1)
614 {
616 }
617 }
618 item = default(T);
619 return -1;
620 }
621
622 public void CompleteAdding()
623 {
626 {
627 return;
628 }
629 SpinWait spinWait = default(SpinWait);
630 while (true)
631 {
633 if (((uint)currentAdders & 0x80000000u) != 0)
634 {
635 spinWait.Reset();
636 while (_currentAdders != int.MinValue)
637 {
638 spinWait.SpinOnce();
639 }
640 return;
641 }
643 {
644 break;
645 }
646 spinWait.SpinOnce(-1);
647 }
648 spinWait.Reset();
649 while (_currentAdders != int.MinValue)
650 {
651 spinWait.SpinOnce();
652 }
653 if (Count == 0)
654 {
656 }
658 }
659
664
669
670 public void Dispose()
671 {
672 Dispose(disposing: true);
673 GC.SuppressFinalize(this);
674 }
675
676 protected virtual void Dispose(bool disposing)
677 {
678 if (!_isDisposed)
679 {
680 if (_freeNodes != null)
681 {
683 }
685 _isDisposed = true;
686 }
687 }
688
689 public T[] ToArray()
690 {
692 return _collection.ToArray();
693 }
694
695 public void CopyTo(T[] array, int index)
696 {
698 }
699
701 {
703 T[] array2 = _collection.ToArray();
704 try
705 {
706 Array.Copy(array2, 0, array, index, array2.Length);
707 }
709 {
710 throw new ArgumentNullException("array");
711 }
713 {
715 }
716 catch (ArgumentException)
717 {
719 }
720 catch (RankException)
721 {
723 }
725 {
727 }
729 {
731 }
732 }
733
738
758
760 {
762 return _collection.GetEnumerator();
763 }
764
766 {
767 return ((IEnumerable<T>)this).GetEnumerator();
768 }
769
771 {
772 if (collections == null)
773 {
774 throw new ArgumentNullException("collections");
775 }
776 if (collections.Length < 1)
777 {
779 }
780 if (collections.Length > 63 || (collections.Length == 63 && Thread.CurrentThread.GetApartmentState() == ApartmentState.STA))
781 {
783 }
784 for (int i = 0; i < collections.Length; i++)
785 {
786 if (collections[i] == null)
787 {
789 }
791 {
793 }
795 {
797 }
798 }
799 }
800
801 private static void ValidateTimeout(TimeSpan timeout)
802 {
803 long num = (long)timeout.TotalMilliseconds;
804 if ((num < 0 || num > int.MaxValue) && num != -1)
805 {
807 }
808 }
809
817
818 private void CheckDisposed()
819 {
820 if (_isDisposed)
821 {
822 throw new ObjectDisposedException("BlockingCollection", System.SR.BlockingCollection_Disposed);
823 }
824 }
825}
static unsafe void Copy(Array sourceArray, Array destinationArray, int length)
Definition Array.cs:624
bool TryTake([MaybeNullWhen(false)] out T item, int millisecondsTimeout)
bool TryTakeWithNoTimeValidation([MaybeNullWhen(false)] out T item, int millisecondsTimeout, CancellationToken cancellationToken, CancellationTokenSource combinedTokenSource)
static int AddToAny(BlockingCollection< T >[] collections, T item, CancellationToken cancellationToken)
static int TryTakeFromAny(BlockingCollection< T >[] collections, out T? item, int millisecondsTimeout, CancellationToken cancellationToken)
static int TryAddToAny(BlockingCollection< T >[] collections, T item, int millisecondsTimeout)
bool TryAdd(T item, int millisecondsTimeout)
static int TryTakeFromAny(BlockingCollection< T >[] collections, out T? item, TimeSpan timeout)
static int TryAddToAnyCore(BlockingCollection< T >[] collections, T item, int millisecondsTimeout, CancellationToken externalCancellationToken)
bool TryTake([MaybeNullWhen(false)] out T item, TimeSpan timeout)
bool TryTake([MaybeNullWhen(false)] out T item)
IEnumerable< T > GetConsumingEnumerable(CancellationToken cancellationToken)
BlockingCollection(IProducerConsumerCollection< T > collection, int boundedCapacity)
static int TryAddToAnyFast(BlockingCollection< T >[] collections, T item)
void Initialize(IProducerConsumerCollection< T > collection, int boundedCapacity, int collectionCount)
static int TryTakeFromAnyCoreSlow(BlockingCollection< T >[] collections, out T item, int millisecondsTimeout, bool isTakeOperation, CancellationToken externalCancellationToken)
static int UpdateTimeOut(uint startTime, int originalWaitMillisecondsTimeout)
void Add(T item, CancellationToken cancellationToken)
bool TryAddWithNoTimeValidation(T item, int millisecondsTimeout, CancellationToken cancellationToken)
static void ValidateCollectionsArray(BlockingCollection< T >[] collections, bool isAddOperation)
static int TryTakeFromAny(BlockingCollection< T >[] collections, out T? item)
bool TryTake([MaybeNullWhen(false)] out T item, int millisecondsTimeout, CancellationToken cancellationToken)
static int TryTakeFromAnyCore(BlockingCollection< T >[] collections, out T item, int millisecondsTimeout, bool isTakeOperation, CancellationToken externalCancellationToken)
static int TryAddToAny(BlockingCollection< T >[] collections, T item, int millisecondsTimeout, CancellationToken cancellationToken)
bool TryAdd(T item, int millisecondsTimeout, CancellationToken cancellationToken)
static int TakeFromAny(BlockingCollection< T >[] collections, out T? item, CancellationToken cancellationToken)
static int TryTakeFromAny(BlockingCollection< T >[] collections, out T? item, int millisecondsTimeout)
static void ValidateMillisecondsTimeout(int millisecondsTimeout)
BlockingCollection(IProducerConsumerCollection< T > collection)
T Take(CancellationToken cancellationToken)
static int TryAddToAny(BlockingCollection< T >[] collections, T item, TimeSpan timeout)
static List< WaitHandle > GetHandles(BlockingCollection< T >[] collections, CancellationToken externalCancellationToken, bool isAddOperation, out CancellationToken[] cancellationTokens)
static int TryAddToAny(BlockingCollection< T >[] collections, T item)
static int TakeFromAny(BlockingCollection< T >[] collections, out T? item)
static int AddToAny(BlockingCollection< T >[] collections, T item)
void CopyTo(KeyValuePair< TKey, TValue >[] array, int index)
bool TryAdd(TKey key, TValue value)
void Add(TKey key, TValue value)
static int TickCount
static void SuppressFinalize(object obj)
Definition GC.cs:202
Definition GC.cs:8
static CultureInfo InvariantCulture
static string BlockingCollection_CopyTo_NonNegative
Definition SR.cs:30
static string BlockingCollection_ValidateCollectionsArray_LargeSize
Definition SR.cs:46
static string BlockingCollection_Take_CollectionModified
Definition SR.cs:40
static string BlockingCollection_CopyTo_MultiDim
Definition SR.cs:28
static string ConcurrentCollection_SyncRoot_NotSupported
Definition SR.cs:58
static string BlockingCollection_CopyTo_IncorrectType
Definition SR.cs:26
static string BlockingCollection_Add_Failed
Definition SR.cs:16
static string BlockingCollection_CantTakeAnyWhenAllDone
Definition SR.cs:20
static string Format(string resourceFormat, object p1)
Definition SR.cs:118
static string BlockingCollection_ValidateCollectionsArray_ZeroSize
Definition SR.cs:50
static string BlockingCollection_ValidateCollectionsArray_NullElems
Definition SR.cs:48
static string BlockingCollection_ctor_BoundedCapacityRange
Definition SR.cs:34
static string BlockingCollection_CantAddAnyWhenCompleted
Definition SR.cs:18
static string BlockingCollection_TimeoutInvalid
Definition SR.cs:42
static string BlockingCollection_ValidateCollectionsArray_DispElems
Definition SR.cs:44
static string BlockingCollection_CantTakeWhenDone
Definition SR.cs:22
static string Collection_CopyTo_TooManyElems
Definition SR.cs:32
static string BlockingCollection_Add_ConcurrentCompleteAdd
Definition SR.cs:14
static string BlockingCollection_Completed
Definition SR.cs:24
static string BlockingCollection_ctor_CountMoreThanCapacity
Definition SR.cs:36
static string BlockingCollection_Disposed
Definition SR.cs:38
Definition SR.cs:7
static CancellationTokenSource CreateLinkedTokenSource(CancellationToken token1, CancellationToken token2)
static int CompareExchange(ref int location1, int value, int comparand)
static int Decrement(ref int location)
static Thread CurrentThread
Definition Thread.cs:312
static int WaitAny(WaitHandle[] waitHandles, int millisecondsTimeout)
void CopyTo(Array array, int index)