public bool Delete(uint key, TKey subKey, out T data) { uint b = key % (uint)size; Node bucket; if ((bucket = GetBucket(b)) == null) { bucket = InitializeBucket(b); } if (!ListDelete(bucket, ComputeRegularKey(key), subKey, out data)) { return(false); } Interlocked.Decrement(ref count); return(true); }
public bool TryDequeue(out T result) { result = default(T); bool advanced = false; while (!advanced) { Node oldHead = head; Node oldTail = tail; Node oldNext = oldHead.Next; if (oldHead == head) { // Empty case ? if (oldHead == oldTail) { // This should be false then if (oldNext != null) { // If not then the linked list is mal formed, update tail Interlocked.CompareExchange(ref tail, oldNext, oldTail); continue; } result = default(T); return(false); } else { result = oldNext.Value; advanced = Interlocked.CompareExchange(ref head, oldNext, oldHead) == oldHead; } } } Interlocked.Decrement(ref count); return(true); }