public bool TryRemoveHash(int key, out T data) { if (ListDelete(key, out data)) { ClientInterlocked.Decrement(ref count); return(true); } return(false); }
public bool TryDequeue(out T result) { result = default(T); object oldNext = null; bool advanced = false; while (!advanced) { object oldHead = head; object oldTail = tail; oldNext = ((Node)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 ClientInterlocked.CompareExchange(ref tail, oldNext, oldTail); continue; } result = default(T); return(false); } else { if (oldNext != null) { result = ((Node)oldNext).Value; advanced = ClientInterlocked.CompareExchange(ref head, oldNext, oldHead) == oldHead; } } } } if (null != oldNext) { ((Node)oldNext).Value = default(T); } ClientInterlocked.Decrement(ref count); return(true); }
bool Delete(uint key, TKey subKey, out KeyValuePair <TKey, TValue> 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); } ClientInterlocked.Decrement(ref count); return(true); }
public bool TryPop(out T result) { Node temp; do { temp = (Node)head; // The stak is empty if (temp == null) { result = default(T); return(false); } } while (ClientInterlocked.CompareExchange(ref head, temp.Next, temp) != temp); ClientInterlocked.Decrement(ref count); result = temp.Value; return(true); }