| /* |
| * 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> pushing and popping of object |
| * references. In addition, this can sort the entries currently on |
| * the shared stack. |
| */ |
| @Uninterruptible public class SortTODObjectReferenceStack extends LocalDeque |
| implements Constants { |
| |
| /**************************************************************************** |
| * |
| * Public instance methods |
| */ |
| |
| /** |
| * Constructor |
| * |
| * @param queue The shared stack to which this stack will append |
| * its buffers (when full or flushed) and from which it will aquire new |
| * buffers when it has exhausted its own. |
| */ |
| public SortTODObjectReferenceStack(SortTODSharedDeque queue) { |
| super(queue); |
| } |
| |
| /** |
| * Sort the address on the shared stack. |
| */ |
| public final void sort() { |
| flushLocal(); |
| ((SortTODSharedDeque) queue).sort(); |
| } |
| |
| /** |
| * Push an address onto the address stack. |
| * |
| * @param object the object to be pushed onto the object queue |
| */ |
| @Inline |
| public final void push(ObjectReference object) { |
| Address addr = object.toAddress(); |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero()); |
| checkHeadInsert(1); |
| uncheckedHeadInsert(addr); |
| } |
| |
| /** |
| * Pop an address from the address stack, return zero if the stack |
| * is empty. |
| * |
| * @return The next address in the address stack, or zero if the |
| * stack is empty |
| */ |
| @Inline |
| public final ObjectReference pop() { |
| if (checkDequeue(1)) { |
| return uncheckedDequeue().toObjectReference(); |
| } else { |
| return ObjectReference.nullReference(); |
| } |
| } |
| |
| /** |
| * Check if the (local and shared) stacks are empty. |
| * |
| * @return True if there are no more entries on the local & shared stack, |
| * false otherwise. |
| */ |
| @Inline |
| public final boolean isEmpty() { |
| return !checkDequeue(1); |
| } |
| } |