Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }