001    /*
002     * cs101 Graphical Boolean semaphore utility
003     * $Id: GBS.java,v 1.3 2003/09/23 15:36:21 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    import java.awt.*;
016    import cs101.awt.ColorField;
017    
018    /**
019     * Implements simple binary semaphores in java witha graphical display. <br>
020     * Interface is gbs.request(), gbs.release().<br>
021     * It also provides a graphical display of the semaphores status.<br>
022     * <p>
023     * This utility borrows heavily from the design and implementation
024     * of cs101.util.BS.  It mearly adds a graphical display.
025     * <br>
026     * Copyright 1996 Massachusetts Institute of Technology
027     *
028     * @author  Todd C. Parnell, tparnell@ai.mit.edu
029     * @author  Joshua R. Brown, reuben@ai.mit.edu (added graphics)
030     * @author  Lynn Andrea Stein, las@ai.mit.edu (semaphore design)
031     * @version $Id: GBS.java,v 1.3 2003/09/23 15:36:21 gus Exp $
032     *
033     */
034    public class GBS extends GraphicalSemaphore {
035    
036      /** The current state of the semaphore.
037       *  true => busy , false => free
038       */
039      private boolean busy; 
040    
041      /** The graphical display of the semaphore */
042      private ColorField sqr;
043    
044      //GBS(boolean, String)
045      /**
046       * Constructs a binary semaphore with the intial value passed in.
047       *
048       * @param initVal  Initial value for semaphore.  (true => in use)
049       * @param label    Used to identfy the semaphore in the display.
050       */
051      public GBS (boolean initVal, String label) {
052        super(label);
053        this.busy = initVal;
054    
055        // now that everything is initialized setup the GUI
056        this.setupGUI();  
057    
058      }
059      
060      /**
061       * Does all of the graphical setup on this level
062       * then calls the superclasses method to finish the setup.
063       *
064       * This method is primarly responsible for setting up the 
065       * display Panel.
066       */
067      protected void setupGUI() {
068        // Graphics setup on this level
069        this.sqr = new ColorField(this.busy, new Dimension(25,25),
070                              Color.red, Color.green);
071    
072        this.display = new Panel();
073        this.display.add(this.sqr);
074        
075        // Graphics setup in super-class
076        super.setupGUI();
077      
078      }
079    
080      /**
081       * Requests the semaphore.  If the semaphore is currently busy,
082       * causes the requesting process to wait() until the semaphore is
083       * release()d.  Unlike java.lang.Object.wait(), the requesting
084       * process is not suspended if the semaphore is currently free.
085       *
086       * @see #release
087       * @see java.lang.Object#wait
088       */
089      synchronized public void request () {
090        while (this.busy) {
091          try {this.wait();} catch (InterruptedException e) {}
092        }
093        this.busy = true;
094        this.showStatus();
095      }
096    
097      /**
098       * Releases the semaphore.  Any objects currently wait()ing on the
099       * semaphore are notify()d (and one of them will be granted the
100       * semaphore).  Unlike java.lang.Object.notify(), the semaphore is
101       * also freed so that if there are no wait()ing objects, the next
102       * object to request() the semaphore will receive it.
103       *
104       * @see #request
105       * @see java.lang.Object#notifyAll()
106       */
107      synchronized public void release () {
108        this.busy = false;
109        this.notifyAll();
110        this.showStatus();
111      }
112    
113      /**
114       * Prints out the current state of the semaphore.
115       * Changes the graphical display.
116       */
117      protected void showStatus() {      
118        // tab over an approprate amount
119        for (int i = 0; i<this.myNumber; i++) 
120          System.out.print("               ");
121    
122        // now print the status 
123        System.out.print(this.label.getText()+": ");
124        if (this.busy)
125          System.out.println("BUSY");
126        else 
127          System.out.println("FREE");
128        
129        // update the status field
130        this.sqr.changeState(this.busy);
131      }
132    
133    }
134    
135    /* Comments:
136     *
137     * History:
138     *     $Log: GBS.java,v $
139     *     Revision 1.3  2003/09/23 15:36:21  gus
140     *     javadoc fix
141     *
142     *     Revision 1.2  2003/09/23 14:43:13  gus
143     *     javadoc fix
144     *
145     *     Revision 1.1.1.1  2002/06/05 21:56:32  root
146     *     CS101 comes to Olin finally.
147     *
148     *     Revision 1.1  2000/04/24 22:17:22  nathanw
149     *     Bulk reorganization
150     *
151     *     Revision 1.4  1998/07/24 17:19:26  tparnell
152     *     Placate new javadoc behavior
153     *
154     *     Revision 1.3  1998/07/22 18:18:55  tparnell
155     *     migration from cs101.util to cs101.*
156     *
157     *     Revision 1.2  1998/06/03 19:42:00  tparnell
158     *     update from Java 1.0 to 1.1
159     *
160     *     Revision 1.1  1998/03/13 22:18:13  tparnell
161     *     Import from server crash.  I think the src and class files match up.
162     *
163     *     Revision 1.5  1996/08/01 18:26:22  reuben
164     *     More javadoc tweaking (hopefully the final pass)
165     *
166     *     Revision 1.4  1996/07/30 17:25:59  reuben
167     *     Added/corrected javadoc comments.
168     *
169     *     Revision 1.3  1996/07/25 18:27:41  reuben
170     *     Added all kinds of comments.
171     *     Compiled and tested.
172     *
173     *     Revision 1.2  1996/07/25 15:33:27  reuben
174     *     testing
175     *
176     */