001 //package edu.unima.ky.parallel;
002
003 /**
004 * Bounded buffer.
005 * @author Akitoshi Yoshida
006 * @author Heinz Kredel.
007 */
008 public class BoundedBuffer extends Object {
009
010 /**
011 * The buffer storage of objects.
012 */
013 private Object[] buffer;
014
015 /**
016 * The size of the buffer.
017 */
018 private int size;
019
020 /**
021 * The position of the first filled cell.
022 */
023 private int front;
024
025 /**
026 * The position of the first empty cell.
027 */
028 private int rear;
029
030 /**
031 * A semaphore to indicate an empty buffer.
032 */
033 private Sema empty;
034
035 /**
036 * A semaphore to indicate a full buffer.
037 */
038 private Sema full;
039
040 private Object pt;
041 private Object gt;
042
043 /**
044 * Constructs a BoundedBuffer with a desired size.
045 * @param init the size of the buffer.
046 */
047 public BoundedBuffer(int init) {
048 buffer = new Object[init];
049 size = init;
050 front = 0;
051 rear = 0;
052 empty = new Sema(init);
053 full = new Sema(0);
054 pt = new Object();
055 gt = new Object();
056 }
057
058
059 /**
060 * Tests if the BoundedBuffer is empty.
061 * If it is, gives back the value true.
062 * @return The boolean value of
063 (whether the BoundedBuffer is empty or not).
064 */
065 public boolean empty() {
066 return (front == rear);
067 }
068
069
070 /**
071 * Put an object to the BoundedBuffer.
072 * @param v an object to be put to the buffer.
073 */
074 public void put(Object v) {
075 empty.P();
076 synchronized (pt) {
077 if (rear >= size) rear -= size;
078 buffer[ rear ] = v;
079 rear++;
080 }
081 full.V();
082 }
083
084 /**
085 * Get an object from the BoundedBuffer.
086 */
087 public Object get() {
088 Object v;
089 full.P();
090 synchronized (gt) {
091 if (front >= size) front -= size;
092 v = buffer[ front ];
093 front++;
094 }
095 empty.V();
096 return v;
097 }
098 }