/* * 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 addresses */ @Uninterruptible public class AddressDeque 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 AddressDeque(String n, SharedDeque queue) { super(queue); name = n; } /** * Insert an address into the address queue. * * @param addr the address to be inserted into the address queue */ @Inline public final void insert(Address addr) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero()); checkTailInsert(1); uncheckedTailInsert(addr); } /** * Insert an address into the address queue, force this out of line * ("OOL"), in some circumstnaces it is too expensive to have the * insert inlined, so this call is made. * * @param addr the address to be inserted into the address queue */ @NoInline public final void insertOOL(Address addr) { insert(addr); } /** * Push an address onto the address queue. * * @param addr the address to be pushed onto the address queue */ @Inline public final void push(Address addr) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero()); checkHeadInsert(1); uncheckedHeadInsert(addr); } /** * Push an address onto the address 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 addr the address to be pushed onto the address queue */ @NoInline public final void pushOOL(Address addr) { push(addr); } /** * Pop an address from the address queue, return zero if the queue * is empty. * * @return The next address in the address queue, or zero if the * queue is empty */ @Inline public final Address pop() { if (checkDequeue(1)) { return uncheckedDequeue(); } else { return Address.zero(); } } @Inline public final boolean isEmpty() { return !checkDequeue(1); } @Inline public final boolean isNonEmpty() { return checkDequeue(1); } }