package system.util;

//import market.*;
/**
 * The queue for the RateMeter
 * Creation date: (07.6.2000 “. 17:17:35)
 * @author: tin
 */
public class Queue_rate extends Queue {
	public int Num_forWake = 10;
	private Thread	rateThread;

/**
 * Queue_rate constructor comment.
 * @param bufferSize int
 */
public Queue_rate(int bufferSize ) {
	super(bufferSize);
}
/**
 * Queue_rate constructor comment.
 * @param bufferSize int
 */
public Queue_rate(int bufferSize , Thread rateThread) {
	super(bufferSize);
	this.rateThread=rateThread;
}
/**
 * Read Object from queue.<br>
 * Creation date: (1/9/00 10:50:57 PM)
 * @return java.lang.Object
 */
public Object readObject() {
	Object tmpObj;
	synchronized (SynchRead) {
		if ((curWrite == curRead) && (numOfElement == 0)) {
			canRead = false;
		}
		tmpObj = buffer[curRead];
		buffer[curRead] = null;
		numOfElement--;
		curRead = getNextIndex(curRead);
		if (!canWrite) {
			canWrite = true;
		}
	}
	return tmpObj;
}
/**
 * Set reader thread. When queue is empty thread will auto suspend. If queue is great of num_forWake element reader thread will be wake.  
 * Creation date: (9.6.00 15:31:39)
 * @param mRateMeter java.lang.Thread
 */
public void setReaderThread(Thread mRateMeter) {
	rateThread = mRateMeter;
}
/**
 * Insert the method's description here.
 * Creation date: (07.6.2000 “. 19:09:42)
 */
private void wakeThread() {
	if (Num_forWake < getNumOfElement()) {
		rateThread.resume();
	}
}
/**
 * Write Object to queue.<br>
 * Creation date: (1/9/00 10:43:15 PM)
 * @param obj java.lang.Object
 */
public void writeObject(Object obj) {
	synchronized (SynchWrite) {
		if ((curWrite == curRead) && (numOfElement == buffer.length)) {
			canWrite = false;
			while (!canWrite) {
				try {
					Thread.yield();
					Thread.sleep(100);
				} catch (Exception e) {
				}
			}
		}
		buffer[curWrite] = obj;
		numOfElement++;
		curWrite = getNextIndex(curWrite);
		if (!canRead) {
			canRead = true;
		}
		wakeThread();
	}
}
}

