--- old/src/java.corba/share/classes/com/sun/corba/se/impl/orbutil/concurrent/CondVar.java 2018-01-30 20:19:21.000000000 -0500 +++ /dev/null 2018-01-30 20:19:21.000000000 -0500 @@ -1,340 +0,0 @@ -/* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - File: ConditionVariable.java - - Originally written by Doug Lea and released into the public domain. - This may be used for any purposes whatsoever without acknowledgment. - Thanks for the assistance and support of Sun Microsystems Labs, - and everyone contributing, testing, and using this code. - - History: - Date Who What - 11Jun1998 dl Create public version - 08dec2001 kmc Added support for Reentrant Mutexes -*/ - -package com.sun.corba.se.impl.orbutil.concurrent; - -import com.sun.corba.se.impl.orbutil.ORBUtility ; - -/** - * This class is designed for fans of POSIX pthreads programming. - * If you restrict yourself to Mutexes and CondVars, you can - * use most of your favorite constructions. Don't randomly mix them - * with synchronized methods or blocks though. - *

- * Method names and behavior are as close as is reasonable to - * those in POSIX. - *

- * Sample Usage. Here is a full version of a bounded buffer - * that implements the BoundedChannel interface, written in - * a style reminscent of that in POSIX programming books. - *

- * class CVBuffer implements BoundedChannel {
- *   private final Mutex mutex;
- *   private final CondVar notFull;
- *   private final CondVar notEmpty;
- *   private int count = 0;
- *   private int takePtr = 0;
- *   private int putPtr = 0;
- *   private final Object[] array;
- *
- *   public CVBuffer(int capacity) {
- *     array = new Object[capacity];
- *     mutex = new Mutex();
- *     notFull = new CondVar(mutex);
- *     notEmpty = new CondVar(mutex);
- *   }
- *
- *   public int capacity() { return array.length; }
- *
- *   public void put(Object x) throws InterruptedException {
- *     mutex.acquire();
- *     try {
- *       while (count == array.length) {
- *         notFull.await();
- *       }
- *       array[putPtr] = x;
- *       putPtr = (putPtr + 1) % array.length;
- *       ++count;
- *       notEmpty.signal();
- *     }
- *     finally {
- *       mutex.release();
- *     }
- *   }
- *
- *   public Object take() throws InterruptedException {
- *     Object x = null;
- *     mutex.acquire();
- *     try {
- *       while (count == 0) {
- *         notEmpty.await();
- *       }
- *       x = array[takePtr];
- *       array[takePtr] = null;
- *       takePtr = (takePtr + 1) % array.length;
- *       --count;
- *       notFull.signal();
- *     }
- *     finally {
- *       mutex.release();
- *     }
- *     return x;
- *   }
- *
- *   public boolean offer(Object x, long msecs) throws InterruptedException {
- *     mutex.acquire();
- *     try {
- *       if (count == array.length) {
- *         notFull.timedwait(msecs);
- *         if (count == array.length)
- *           return false;
- *       }
- *       array[putPtr] = x;
- *       putPtr = (putPtr + 1) % array.length;
- *       ++count;
- *       notEmpty.signal();
- *       return true;
- *     }
- *     finally {
- *       mutex.release();
- *     }
- *   }
- *
- *   public Object poll(long msecs) throws InterruptedException {
- *     Object x = null;
- *     mutex.acquire();
- *     try {
- *       if (count == 0) {
- *         notEmpty.timedwait(msecs);
- *         if (count == 0)
- *           return null;
- *       }
- *       x = array[takePtr];
- *       array[takePtr] = null;
- *       takePtr = (takePtr + 1) % array.length;
- *       --count;
- *       notFull.signal();
- *     }
- *     finally {
- *       mutex.release();
- *     }
- *     return x;
- *   }
- * }
- *
- * 
- * @see Mutex - * [ Introduction to this package. ] - **/ - -public class CondVar { - - protected boolean debug_ ; - - /** The mutex **/ - protected final Sync mutex_; - protected final ReentrantMutex remutex_; - - private int releaseMutex() - { - int count = 1 ; - - if (remutex_!=null) - count = remutex_.releaseAll() ; - else - mutex_.release() ; - - return count ; - } - - private void acquireMutex( int count ) throws InterruptedException - { - if (remutex_!=null) - remutex_.acquireAll( count ) ; - else - mutex_.acquire() ; - } - - /** - * Create a new CondVar that relies on the given mutual - * exclusion lock. - * @param mutex A mutual exclusion lock which must either be non-reentrant, - * or else be ReentrantMutex. - * Standard usage is to supply an instance of Mutex, - * but, for example, a Semaphore initialized to 1 also works. - * On the other hand, many other Sync implementations would not - * work here, so some care is required to supply a sensible - * synchronization object. - * In normal use, the mutex should be one that is used for all - * synchronization of the object using the CondVar. Generally, - * to prevent nested monitor lockouts, this - * object should not use any native Java synchronized blocks. - **/ - - public CondVar(Sync mutex, boolean debug) { - debug_ = debug ; - mutex_ = mutex; - if (mutex instanceof ReentrantMutex) - remutex_ = (ReentrantMutex)mutex; - else - remutex_ = null; - } - - public CondVar( Sync mutex ) { - this( mutex, false ) ; - } - - /** - * Wait for notification. This operation at least momentarily - * releases the mutex. The mutex is always held upon return, - * even if interrupted. - * @exception InterruptedException if the thread was interrupted - * before or during the wait. However, if the thread is interrupted - * after the wait but during mutex re-acquisition, the interruption - * is ignored, while still ensuring - * that the currentThread's interruption state stays true, so can - * be probed by callers. - **/ - public void await() throws InterruptedException { - int count = 0 ; - if (Thread.interrupted()) - throw new InterruptedException(); - - try { - if (debug_) - ORBUtility.dprintTrace( this, "await enter" ) ; - - synchronized(this) { - count = releaseMutex() ; - try { - wait(); - } catch (InterruptedException ex) { - notify(); - throw ex; - } - } - } finally { - // Must ignore interrupt on re-acquire - boolean interrupted = false; - for (;;) { - try { - acquireMutex( count ); - break; - } catch (InterruptedException ex) { - interrupted = true; - } - } - - if (interrupted) { - Thread.currentThread().interrupt(); - } - - if (debug_) - ORBUtility.dprintTrace( this, "await exit" ) ; - } - } - - /** - * Wait for at most msecs for notification. - * This operation at least momentarily - * releases the mutex. The mutex is always held upon return, - * even if interrupted. - * @param msecs The time to wait. A value less than or equal to zero - * causes a momentarily release - * and re-acquire of the mutex, and always returns false. - * @return false if at least msecs have elapsed - * upon resumption; else true. A - * false return does NOT necessarily imply that the thread was - * not notified. For example, it might have been notified - * after the time elapsed but just before resuming. - * @exception InterruptedException if the thread was interrupted - * before or during the wait. - **/ - - public boolean timedwait(long msecs) throws InterruptedException { - - if (Thread.interrupted()) - throw new InterruptedException(); - - boolean success = false; - int count = 0; - - try { - if (debug_) - ORBUtility.dprintTrace( this, "timedwait enter" ) ; - - synchronized(this) { - count = releaseMutex() ; - try { - if (msecs > 0) { - long start = System.currentTimeMillis(); - wait(msecs); - success = System.currentTimeMillis() - start <= msecs; - } - } catch (InterruptedException ex) { - notify(); - throw ex; - } - } - } finally { - // Must ignore interrupt on re-acquire - boolean interrupted = false; - for (;;) { - try { - acquireMutex( count ) ; - break; - } catch (InterruptedException ex) { - interrupted = true; - } - } - - if (interrupted) { - Thread.currentThread().interrupt(); - } - - if (debug_) - ORBUtility.dprintTrace( this, "timedwait exit" ) ; - } - return success; - } - - /** - * Notify a waiting thread. - * If one exists, a non-interrupted thread will return - * normally (i.e., not via InterruptedException) from await or timedwait. - **/ - public synchronized void signal() { - notify(); - } - - /** Notify all waiting threads **/ - public synchronized void broadcast() { - notifyAll(); - } -}