001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.mmtk.utility.deque;
014
015 import org.mmtk.utility.Constants;
016
017 import org.mmtk.vm.VM;
018
019 import org.vmmagic.unboxed.*;
020 import org.vmmagic.pragma.*;
021
022 /**
023 * This supports <i>unsynchronized</i> enqueuing and dequeuing of addresses
024 */
025 @Uninterruptible public class AddressDeque extends LocalDeque
026 implements Constants {
027
028 /****************************************************************************
029 *
030 * Public instance methods
031 */
032
033 /**
034 *
035 */
036 public final String name;
037
038 /**
039 * Constructor
040 *
041 * @param queue The shared queue to which this queue will append
042 * its buffers (when full or flushed) and from which it will aquire new
043 * buffers when it has exhausted its own.
044 */
045 public AddressDeque(String n, SharedDeque queue) {
046 super(queue);
047 name = n;
048 }
049
050 /**
051 * Insert an address into the address queue.
052 *
053 * @param addr the address to be inserted into the address queue
054 */
055 @Inline
056 public final void insert(Address addr) {
057 if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero());
058 checkTailInsert(1);
059 uncheckedTailInsert(addr);
060 }
061
062 /**
063 * Insert an address into the address queue, force this out of line
064 * ("OOL"), in some circumstances it is too expensive to have the
065 * insert inlined, so this call is made.
066 *
067 * @param addr the address to be inserted into the address queue
068 */
069 @NoInline
070 public final void insertOOL(Address addr) {
071 insert(addr);
072 }
073
074 /**
075 * Push an address onto the address queue.
076 *
077 * @param addr the address to be pushed onto the address queue
078 */
079 @Inline
080 public final void push(Address addr) {
081 if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr.isZero());
082 checkHeadInsert(1);
083 uncheckedHeadInsert(addr);
084 }
085
086 /**
087 * Push an address onto the address queue, force this out of line
088 * ("OOL"), in some circumstances it is too expensive to have the
089 * push inlined, so this call is made.
090 *
091 * @param addr the address to be pushed onto the address queue
092 */
093 @NoInline
094 public final void pushOOL(Address addr) {
095 push(addr);
096 }
097
098 /**
099 * Pop an address from the address queue, return zero if the queue
100 * is empty.
101 *
102 * @return The next address in the address queue, or zero if the
103 * queue is empty
104 */
105 @Inline
106 public final Address pop() {
107 if (checkDequeue(1)) {
108 return uncheckedDequeue();
109 } else {
110 return Address.zero();
111 }
112 }
113
114 @Inline
115 public final boolean isEmpty() {
116 return !checkDequeue(1);
117 }
118
119 @Inline
120 public final boolean isNonEmpty() {
121 return checkDequeue(1);
122 }
123
124 }