| /* |
| * 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.Uninterruptible; |
| |
| |
| /** |
| * This supports <i>unsynchronized</i> enqueuing and dequeuing of |
| * address triples |
| */ |
| @Uninterruptible public class AddressTripleDeque extends LocalDeque implements Constants { |
| |
| /**************************************************************************** |
| * |
| * Public instance methods |
| */ |
| |
| /** |
| * 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. |
| */ |
| AddressTripleDeque(SharedDeque queue) { |
| super(queue); |
| } |
| |
| /** |
| * Insert an address triple into the address queue. |
| * |
| * @param addr1 the first address to be inserted into the address queue |
| * @param addr2 the second address to be inserted into the address queue |
| * @param addr3 the third address to be inserted into the address queue |
| */ |
| public final void insert(Address addr1, Address addr2, |
| Address addr3) { |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr1.isZero()); |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr2.isZero()); |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr3.isZero()); |
| checkTailInsert(3); |
| uncheckedTailInsert(addr1); |
| uncheckedTailInsert(addr2); |
| uncheckedTailInsert(addr3); |
| } |
| /** |
| * Push an address pair onto the address queue. |
| * |
| * @param addr1 the first value to be pushed onto the address queue |
| * @param addr2 the second value to be pushed onto the address queue |
| * @param addr3 the third address to be pushed onto the address queue |
| */ |
| public final void push(Address addr1, Address addr2, Address addr3) { |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr1.isZero()); |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr2.isZero()); |
| if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!addr3.isZero()); |
| checkHeadInsert(3); |
| uncheckedHeadInsert(addr3); |
| uncheckedHeadInsert(addr2); |
| uncheckedHeadInsert(addr1); |
| } |
| |
| /** |
| * Pop the first address in a triple 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 |
| */ |
| public final Address pop1() { |
| if (checkDequeue(3)) |
| return uncheckedDequeue(); |
| else |
| return Address.zero(); |
| } |
| |
| /** |
| * Pop the second address in a triple from the address queue. |
| * |
| * @return The next address in the address queue |
| */ |
| public final Address pop2() { |
| return uncheckedDequeue(); |
| } |
| |
| |
| /** |
| * Pop the third address in a triple from the address queue. |
| * |
| * @return The next address in the address queue |
| */ |
| public final Address pop3() { |
| return uncheckedDequeue(); |
| } |
| } |