/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Common Public License (CPL);
* 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/cpl1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.scheduler.greenthreads;
import org.vmmagic.pragma.Uninterruptible;
/**
* Base class for objects specifying an event being waited for
* while a <code>VM_Thread</code> is on a {@link VM_ThreadEventWaitQueue}.
* Subclasses <em>must</em> directly implement the
* {@link Uninterruptible} interface.
*/
@Uninterruptible
public abstract class VM_ThreadEventWaitData implements VM_ThreadEventConstants {
/**
* Timestamp at which time the thread should return from its
* wait if the event it is waiting for has not occurred.
*/
private final long maxWaitNano;
/** Accessor for maxWaitCycle */
long getMaxWaitNano() {
return maxWaitNano;
}
/*
* Flags describing state and outcome of wait.
*/
/**
* Set if thread is suspended while executing native code.
*/
private boolean _native;
/**
* Set if thread has been marked to be taken off the wait queue.
*/
private boolean finished;
/**
* The event wait timed out.
*/
private boolean timedout;
/**
* The thread was interrupted before the event or the timeout occurred.
*/
private boolean interrupted;
/** The thread is waiting on a queue (NB state at construction)*/
boolean isPending() {
return !_native && !finished && !timedout && !interrupted;
}
/** Was the thread suspended while executing native code? */
boolean isNative() {
return _native;
}
/** The thread was suspended while executing native code. */
void setNative() {
_native = true;
}
/** Is the thread marked to be taken off the wait queue? */
boolean isFinished() {
return finished;
}
/** Set that the thread should be taken off the wait queue. */
void setFinished() {
finished = true;
}
/** Clear that the thread should be taken off the wait queue. */
void clearFinished() {
finished = false;
}
/** Did the event wait time out? */
public boolean isTimedOut() {
return timedout;
}
/** Was the thread was interrupted before the event or the timeout occurred? */
boolean isInterrupted() {
return interrupted;
}
/** The thread is finished from an interrupt */
void setFinishedAndInterrupted() {
finished = true;
interrupted = true;
}
/** The thread is finished from a timeout */
void setFinishedAndTimeout() {
finished = true;
timedout = true;
}
/**
* Constructor.
* @param maxWaitNano the timestamp when the wait should end
*/
VM_ThreadEventWaitData(long maxWaitNano) {
// assert isPending();
this.maxWaitNano = maxWaitNano;
}
/**
* Accept a {@link VM_ThreadEventWaitQueue} to inform it
* of the actual type of this object.
*/
abstract void accept(VM_ThreadEventWaitDataVisitor visitor);
}