001 /* 002 * cs101 producer/consumer (single integer) buffer 003 * $Id: IntBuffer.java,v 1.9 2003/09/23 15:37:30 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 * Please do not redistribute without obtaining permission. 010 */ 011 012 package cs101.util.semaphore; 013 014 /** 015 * Implements a producer/consumer synchronized buffer. <br> 016 * Interface is IntBuffer.putButton( int ), IntBuffer.getButton(). This class 017 * does guarantee that no value written to it will be overwritten before it 018 * has been read and also guarantees that once a value has been read it will 019 * not be re-read on subsequent attempts. <p> 020 * 021 * <em>This class only behaves well when a single thread is reading the buffer 022 * and a single thread is writing to the buffer, or the order in which events 023 * are processed is unimportant. This class doesn't guarantee 024 * that competing threads will get to write in a sensible order, and does 025 * not guarantee that competing threads will get to read from the buffer 026 * in a sensible order</em> 027 * 028 * @see cs101.util.semaphore.BS 029 * 030 * @author Lynn Andrea Stein, las@ai.mit.edu 031 * @author Patrick G. Heck, gus.heck@olin.edu 032 * @version $Id: IntBuffer.java,v 1.9 2003/09/23 15:37:30 gus Exp $ 033 * 034 */ 035 public final class IntBuffer { 036 private int button; 037 private BS buttonRead = new BS(true); 038 private BS buttonWrite = new BS(false); 039 040 //putButton( int ) 041 /** 042 * An alternate (calculator oriented) name for {@link #putInt(int)}. 043 * 044 * @param newButton the button to be inserted. 045 * 046 * @see #getButton 047 * @see cs101.util.semaphore.BS 048 */ 049 public void putButton( int newButton ) { 050 this.putInt(newButton); 051 } 052 053 // getButton() 054 /** 055 * An alternate (caluculator oriented) name for {@link #getInt}. 056 * 057 * @return the next button. 058 * 059 * @see #putButton 060 * @see cs101.util.semaphore.BS 061 */ 062 public int getButton() { 063 return this.getInt(); 064 } 065 066 //putButton( int ) 067 /** 068 * (Safely) Puts an int into the IntBuffer. 069 * 070 * @param newButton the value to be inserted. 071 * 072 * @see #getButton 073 * @see cs101.util.semaphore.BS 074 */ 075 public void putInt( int newButton ) { 076 this.buttonWrite.request(); 077 this.button = newButton; 078 this.buttonRead.release(); 079 } 080 081 // getButton() 082 /** 083 * (Safely) Consumes the int held in the IntBuffer. 084 * 085 * @return the integer value. 086 * 087 * @see #putButton 088 * @see cs101.util.semaphore.BS 089 */ 090 public int getInt() { 091 this.buttonRead.request(); 092 int b = this.button; 093 this.buttonWrite.release(); 094 return b; 095 } 096 } 097 098 /* Comments: 099 * 100 * History: 101 * $Log: IntBuffer.java,v $ 102 * Revision 1.9 2003/09/23 15:37:30 gus 103 * javadoc fix 104 * 105 * Revision 1.8 2003/09/23 14:42:16 gus 106 * javadoc change 107 * 108 * Revision 1.7 2003/02/27 15:53:39 gus 109 * make me an author 110 * 111 * Revision 1.6 2003/02/27 15:49:55 gus 112 * provided a more generic interface while maintianing the button oriented interface 113 * used by the calculator problem set 114 * 115 * Revision 1.5 2003/02/27 15:38:31 gus 116 * Javadoc tweaks 117 * 118 * Revision 1.4 2003/02/26 19:37:15 gus 119 * expanded class doc comment. 120 * 121 * Revision 1.3 2002/11/25 15:36:22 gus 122 * fix typo in last vix. 123 * 124 * Revision 1.2 2002/11/25 15:24:20 gus 125 * fix javadoc errors 126 * 127 * Revision 1.1.1.1 2002/06/05 21:56:32 root 128 * CS101 comes to Olin finally. 129 * 130 * Revision 1.1 2000/04/24 22:17:22 nathanw 131 * Bulk reorganization 132 * 133 * Revision 1.2 1998/07/24 17:19:28 tparnell 134 * Placate new javadoc behavior 135 * 136 * Revision 1.1 1998/03/13 22:18:15 tparnell 137 * Import from server crash. I think the src and class files match up. 138 * 139 * Revision 1.3 1996/08/01 18:26:28 reuben 140 * More javadoc tweaking (hopefully the final pass) 141 * 142 * Revision 1.2 1996/07/30 17:26:00 reuben 143 * Added/corrected javadoc comments. 144 * 145 * Revision 1.1.1.1 1996/07/18 17:38:24 sit 146 * Import from /mit/6.096/share/classes after 6.80s session 147 * 148 * Revision 1.1 1996/06/25 22:23:36 las 149 * Initial revision 150 * 151 * 6-25-96 Created by las@ai.mit.edu from PNCBuffer.java 152 * 153 * Revision 1.4 1996/06/19 23:03:02 las 154 * Oops. Renamed BS's methods to correspond with reality. 155 * 156 * 6-19-96 Documentation cleaned up by las@ai.mit.edu 157 * 6-18-96 Created by las@ai.mit.edu 158 * 159 */