Ejemplo n.º 1
0
        public override OfferStatusCodes Offer(T element)
        {
            OfferStatusCodes rval = OfferStatusCodes.SUCCESS;

            long head = ReadCounter;
            long tail = WriteCounter;
            long size = (tail - head);

            if (size >= SPACED_SIZE)
            {
                return(OfferStatusCodes.FULL);
            }

            if (Interlocked.CompareExchange(ref WriteCounter, tail + OFFSET, tail) == tail)
            {
                int index = (int)(tail & SPACED_MASK);
                Interlocked.Exchange(ref buffer[index], element);
                rval = OfferStatusCodes.SUCCESS;
            }
            else
            {
                rval = OfferStatusCodes.FAILED;
            }


            // TODO: a bit of a refactor to get rid of multiple return statements through the function.
            return(rval);
        }
Ejemplo n.º 2
0
        public override OfferStatusCodes Offer(T element)
        {
            OfferStatusCodes result = 0;

            // TODO: Why bother assigning to this other variable because it's still just a reference to the original Array.
            Buffer <T>[] buffers = table;

            int        mask   = buffers.Length - 1;
            Buffer <T> buffer = buffers[probe.Value & mask];

            bool uncontended = true;

            if ((buffers == null) || (mask < 0) || (buffer == null))
            {
                ExpandOrRetry(element, uncontended);
            }
            else
            {
                result      = buffer.Offer(element);
                uncontended = (result != OfferStatusCodes.FAILED);

                if (!uncontended)
                {
                    ExpandOrRetry(element, uncontended);
                }
            }

            return(result);
        }