001 /*
002 * cs101 boolean semaphore utility
003 * $Id: BS.java,v 1.2 2003/09/23 15:35:17 gus Exp $
004 *
005 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
006 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
007 * CS101 homepage</a> or email <las@ai.mit.edu>.
008 *
009 * Copyright (C) 1996 Massachusetts Institute of Technology.
010 * Please do not redistribute without obtaining permission.
011 */
012
013 package cs101.util.semaphore;
014
015 /**
016 * This class implements simple binary semaphores in java. <br>
017 * Interface is bs.request(), bs.release().
018 * <p>
019 * Copyright 1996 Massachusetts Institute of Technology
020 *
021 * @author Lynn Andrea Stein, las@ai.mit.edu
022 * @version $Id: BS.java,v 1.2 2003/09/23 15:35:17 gus Exp $
023 *
024 */
025 public class BS {
026 private boolean busy;
027
028 // BS( boolean )
029 /**
030 * If the constructor is passed a boolean value, the semaphore will
031 * be initialized with this value (true => in use, false => free).
032 *
033 * @param initVal Initial value for semaphore. (true => in use)
034 */
035 public BS (boolean initVal) {
036 this.busy = initVal;
037 }
038
039
040 // BS()
041 /**
042 * If no argument is supplied, the semaphore is created in its free
043 * state.
044 */
045 public BS () {
046 this(false);
047 }
048
049 // request()
050 /**
051 * Requests the semaphore. If the semaphore is currently busy,
052 * causes the requesting process to wait() until the semaphore is
053 * release()d. Unlike java.lang.Object.wait(), the requesting
054 * process is not suspended if the semaphore is currently free.
055 *
056 * @see #release
057 * @see java.lang.Object#wait
058 */
059 synchronized public void request () {
060 while (this.busy) {
061 try {this.wait();} catch (InterruptedException e) {}
062 }
063 this.busy = true;
064 }
065
066 // release()
067 /**
068 * Releases the semaphore. Any objects currently wait()ing on the
069 * semaphore are notify()d (and one of them will be granted the
070 * semaphore). Unlike java.lang.Object.notify(), the semaphore is
071 * also freed so that if there are no wait()ing objects, the next
072 * object to request() the semaphore will receive it.
073 *
074 * @see #request
075 * @see java.lang.Object#notifyAll()
076 */
077 synchronized public void release () {
078 this.busy = false;
079 this.notifyAll();
080 }
081 }
082
083
084 /* Comments:
085 *
086 * History:
087 * $Log: BS.java,v $
088 * Revision 1.2 2003/09/23 15:35:17 gus
089 * javadoc fix
090 *
091 * Revision 1.1.1.1 2002/06/05 21:56:32 root
092 * CS101 comes to Olin finally.
093 *
094 * Revision 1.1 2000/04/24 22:17:22 nathanw
095 * Bulk reorganization
096 *
097 * Revision 1.3 1998/07/24 17:19:22 tparnell
098 * Placate new javadoc behavior
099 *
100 * Revision 1.2 1998/06/24 20:59:27 tparnell
101 * formatting
102 *
103 * Revision 1.1 1998/03/13 22:18:02 tparnell
104 * Import from server crash. I think the src and class files match up.
105 *
106 * Revision 1.5 1996/08/01 18:26:15 reuben
107 * More javadoc tweaking (hopefully the final pass)
108 *
109 * Revision 1.4 1996/07/30 17:25:59 reuben
110 * Added/corrected javadoc comments.
111 *
112 * Revision 1.3 1996/07/25 18:27:41 reuben
113 * Added all kinds of comments.
114 * Compiled and tested.
115 *
116 * Revision 1.2 1996/07/25 15:21:51 reuben
117 * test
118 *
119 * Revision 1.1.1.1 1996/07/18 17:38:24 sit
120 * Import from /mit/6.096/share/classes after 6.80s session
121 *
122 * Revision 1.2 1996/06/19 22:48:05 las
123 * Cleaned up documentation.
124 *
125 * Revision 1.1 1996/06/19 16:47:43 las
126 * Initial revision
127 * 6-19-96 Documentation cleaned up by las@ai.mit.edu
128 * 6-18-96 Created by las@ai.mit.edu
129 *
130 */
131