/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.mmtk.utility.deque; import org.mmtk.utility.Constants; import org.mmtk.vm.VM; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; /** * This supports <i>unsynchronized</i> enqueuing and dequeuing of * object references */ @Uninterruptible public class ObjectReferenceDeque extends LocalDeque implements Constants { /**************************************************************************** * * Public instance methods */ public final String name; /** * Constructor * * @param queue The shared queue to which this queue will append * its buffers (when full or flushed) and from which it will aquire new * buffers when it has exhausted its own. */ public ObjectReferenceDeque(String n, SharedDeque queue) { super(queue); name = n; } /**************************************************************************** * * GPU GC HACKS */ public Address getHead() { return this.head; } public Address getTail() { return this.tail; // Not used } public Address getBufferStart() { return bufferStart(this.head); } /** * Insert an object into the object queue. * * @param object the object to be inserted into the object queue */ @Inline public final void insert(ObjectReference object) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull()); checkTailInsert(1); uncheckedTailInsert(object.toAddress()); } /** * Push an object onto the object queue. * * @param object the object to be pushed onto the object queue */ @Inline public final void push(ObjectReference object) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull()); checkHeadInsert(1); uncheckedHeadInsert(object.toAddress()); } /** * Push an object onto the object queue, force this out of line * ("OOL"), in some circumstnaces it is too expensive to have the * push inlined, so this call is made. * * @param object the object to be pushed onto the object queue */ @NoInline public final void pushOOL(ObjectReference object) { push(object); } /** * Pop an object from the object queue, return zero if the queue * is empty. * * @return The next object in the object queue, or zero if the * queue is empty */ @Inline public final ObjectReference pop() { if (checkDequeue(1)) { return uncheckedDequeue().toObjectReference(); } else { return ObjectReference.nullReference(); } } @Inline public final boolean isEmpty() { return !checkDequeue(1); } @Inline public final boolean isNonEmpty() { return checkDequeue(1); } }