org.mmtk.utility.deque
Class LocalDeque

java.lang.Object
  extended by org.mmtk.utility.deque.Deque
      extended by org.mmtk.utility.deque.LocalSSB
          extended by org.mmtk.utility.deque.LocalQueue
              extended by org.mmtk.utility.deque.LocalDeque
All Implemented Interfaces:
Constants
Direct Known Subclasses:
AddressDeque, AddressPairDeque, AddressTripleDeque, ObjectReferenceDeque, SortTODAddressStack, SortTODObjectReferenceStack

public class LocalDeque
extends LocalQueue
implements Constants

Note this may perform poorly when being used as a FIFO structure with insertHead and pop operations operating on the same buffer. This only uses the fields inherited from LocalQueue, but adds the ability for entries to be added to the head of the deque and popped from the rear.


Field Summary
 
Fields inherited from class org.mmtk.utility.deque.LocalQueue
head
 
Fields inherited from class org.mmtk.utility.deque.LocalSSB
queue, tail, tailBufferEnd
 
Fields inherited from class org.mmtk.utility.deque.Deque
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
 
Fields inherited from interface org.mmtk.utility.Constants
ALIGNMENT_VALUE, ARRAY_ELEMENT, BITS_IN_ADDRESS, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_INT, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_INT, BYTES_IN_KBYTE, BYTES_IN_MBYTE, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, CARD_MASK, CARD_META_PAGES_PER_REGION, INSTANCE_FIELD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_INT, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_ADDRESS_SPACE, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_INT, LOG_BYTES_IN_KBYTE, LOG_BYTES_IN_MBYTE, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD, LOG_CARD_BYTES, LOG_CARD_GRAIN, LOG_CARD_META_BYTES, LOG_CARD_META_PAGES, LOG_CARD_META_SIZE, LOG_CARD_UNITS, LOG_MIN_ALIGNMENT, MAX_ALIGNMENT, MAX_BYTES_PADDING, MAX_INT, MIN_ALIGNMENT, MIN_INT, SUPPORT_CARD_SCANNING
 
Constructor Summary
LocalDeque(SharedDeque queue)
          Constructor
 
Method Summary
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).
 
Methods inherited from class org.mmtk.utility.deque.LocalQueue
checkDequeue, headStarved, resetLocal, uncheckedDequeue
 
Methods inherited from class org.mmtk.utility.deque.LocalSSB
bufferSentinel, checkTailInsert, isFlushed, normalizeTail, reset, uncheckedTailInsert
 
Methods inherited from class org.mmtk.utility.deque.Deque
bufferEnd, bufferFirst, bufferLast, bufferLast, bufferLastOffset, bufferOffset, bufferStart
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

LocalDeque

LocalDeque(SharedDeque queue)
Constructor

Parameters:
queue - The shared deque to which this local deque will append its buffers (when full or flushed).
Method Detail

flushLocal

public final void flushLocal()
Description copied from class: LocalSSB
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).

Overrides:
flushLocal in class LocalSSB

checkHeadInsert

protected final void checkHeadInsert(int arity)
Check whether there is space in the buffer for a pending insert. If there is not sufficient space, allocate a new buffer (dispatching the full buffer to the shared deque if not null).

Parameters:
arity - The arity of the values stored in this deque: the buffer must contain enough space for this many words.

uncheckedHeadInsert

protected final void uncheckedHeadInsert(Address value)
Insert a value at the front of the deque (and buffer). This is unchecked. The caller must first call checkHeadInsert() to ensure the buffer can accommodate the insertion.

Parameters:
value - the value to be inserted.

headOverflow

private void headOverflow(int arity)
Buffer space has been exhausted, allocate a new buffer and enqueue the existing buffer (if any).

Parameters:
arity - The arity of this buffer (used for sanity test only).

closeAndInsertHead

private void closeAndInsertHead(int arity)
Close the head buffer and enqueue it at the front of the shared buffer deque.

Parameters:
arity - The arity of this buffer.

tailStarved

private boolean tailStarved(int arity)
The tail is empty (or 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.

Parameters:
arity - The arity of this buffer
Returns:
true if the consumer has eaten all of the entries