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); }
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); }