/************************************************* * * = PACKAGE * JACE.Concurrency * * = FILENAME * Condition.java * *@author Irfan Pyarali * *************************************************/ package JACE.Concurrency; import JACE.ASX.TimeoutException; import JACE.ASX.TimeValue; /** * Abstraction for traditional * condition variable *

* This condition variable allows the use of one * mutex between multiple conditions. * This implementation is based on the C++ version of ACE. */ public class Condition { /** * Default constructor *@param Mutex for synchronization */ public Condition (Mutex mutex) { mutex_ = mutex; } /** * Wait for condition to become signaled. *@exception InterruptedException exception during wait */ public void Wait () throws InterruptedException { waiters_++; try { mutex_.release(); synchronized (waitObject_) { waitObject_.wait (); } mutex_.acquire (); } finally { waiters_--; } } /** * TimedWait for condition to become signaled. Note that the * given TimeValue is an absolute time, not a relative time. * *@param tv Absolute time to wait until before timing out *@exception TimeoutException wait timed out exception *@exception InterruptedException exception during wait */ public void Wait (TimeValue tv) throws TimeoutException, InterruptedException { waiters_++; try { mutex_.release(); synchronized (waitObject_) { long start = System.currentTimeMillis(); long waitTime = tv.getMilliTime() - start; if (waitTime < 1) throw new TimeoutException (); waitObject_.wait (waitTime); } mutex_.acquire (tv); } finally { waiters_--; } } /** * Signal condition. Wake one waiter (if any). */ public void signal () { synchronized (waitObject_) { waitObject_.notify (); } } /** * Signal condition. Wake up all waiters (if any). */ public void broadcast () { synchronized (waitObject_) { waitObject_.notifyAll (); } } /** * Accessor to lock *@return Mutex */ public Mutex mutex () { return mutex_; } private int waiters_; private Object waitObject_ = new Object (); private Mutex mutex_; }