public class LocalDeque extends LocalQueue
LocalQueue
, but adds
the ability for entries to be added to the head of the deque and popped
from the rear.head
queue, tail, tailBufferEnd
BUFFER_MASK, BUFFER_SIZE, HEAD_INITIAL_VALUE, LOG_PAGES_PER_BUFFER, META_DATA_SIZE, NEXT_FIELD_OFFSET, PAGES_PER_BUFFER, TAIL_INITIAL_VALUE, USABLE_BUFFER_BYTES
Constructor and Description |
---|
LocalDeque(SharedDeque queue)
Constructor
|
Modifier and Type | Method and Description |
---|---|
protected void |
checkHeadInsert(int arity)
Check whether there is space in the buffer for a pending insert.
|
private void |
closeAndInsertHead(int arity)
Close the head buffer and enqueue it at the front of the
shared buffer deque.
|
void |
flushLocal()
Flush the buffer and add it to the shared queue (this will
make any entries in the buffer visible to any consumer associated
with the shared queue).
|
private void |
headOverflow(int arity)
Buffer space has been exhausted, allocate a new buffer and enqueue
the existing buffer (if any).
|
private boolean |
tailStarved(int arity)
The tail is empty (or
null ), and the shared deque has no buffers
available. |
protected void |
uncheckedHeadInsert(Address value)
Insert a value at the front of the deque (and buffer).
|
checkDequeue, headStarved, resetLocal, uncheckedDequeue
bufferSentinel, checkTailInsert, isFlushed, normalizeTail, reset, uncheckedTailInsert
bufferEnd, bufferFirst, bufferLast, bufferLast, bufferLastOffset, bufferOffset, bufferStart
LocalDeque(SharedDeque queue)
queue
- The shared deque to which this local deque will append
its buffers (when full or flushed).public final void flushLocal()
LocalSSB
flushLocal
in class LocalSSB
protected final void checkHeadInsert(int arity)
arity
- The arity of the values stored in this deque: the
buffer must contain enough space for this many words.protected final void uncheckedHeadInsert(Address value)
checkHeadInsert()
to ensure the buffer can accommodate
the insertion.value
- the value to be inserted.private void headOverflow(int arity)
arity
- The arity of this buffer (used for sanity test only).private void closeAndInsertHead(int arity)
arity
- The arity of this buffer.private boolean tailStarved(int arity)
null
), and the shared deque has no buffers
available. If the head has sufficient entries, consume the head.
Otherwise try wait on the shared deque until either all other
clients of the reach exhaustion or a buffer becomes
available.arity
- The arity of this buffertrue
if the consumer has eaten all of the entries