package market.thread;

import market.*;
import market.util.*;

/**
 * Swapper 
 * Creation date: (12/16/99 9:21:52 PM)
 * @author: lucho
 */

public class Swapper extends Thread{
	Queue in;
	Queue out;
	Stack stack;
	Object obj;

public Swapper( int num, ThreadGroup threadGroup, Queue q1, Queue q2){
		super( threadGroup, "Swapper"+num);
		
		stack = new Stack( ConfigMarket.sizeSwapLinks, ConfigMarket.m_SwapLinksFilePath, num );
		in = q1;
		out = q2;
	}
public void run() {
	try {
		while (true) {
			if ( in.canRead() ) {
				obj = in.readObject();
			} else {
				if (stack.isEmpty) {
					obj = in.readObject();
				} else if ( out.canWrite() ){
					obj = stack.pull();
					ConfigMarket.logWriter.log(getName() + ": Pull from stack :", LogPrinter.DEBUG);
				}else{
					sleep(500);
					continue;
				}	
				
			}
			if (obj == null)
				break;
			if ( out.canWrite() )
				out.writeObject(obj);
			else{
				stack.push(obj);
				ConfigMarket.logWriter.log(getName() + ": Push to stack :", LogPrinter.DEBUG);
			}
			yield();
		}
	} catch (ThreadDeath t) {
		ConfigMarket.logWriter.log(getName() + ": Force stop (kill):", LogPrinter.ERROR);
		t.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
		ConfigMarket.logWriter.log(getName() + ": Finish. ", LogPrinter.INFO);
		return;
	} catch (Throwable t) {
		ConfigMarket.logWriter.log(getName() + ": Somting wrong : " + t.toString(), LogPrinter.ERROR);
		t.printStackTrace(ConfigMarket.logWriter.getPrintWriter());
		( (Graber)getThreadGroup() ).sendError();
	}
	
	out.writeObject((Object) null);
	// Destroy stack
	stack = null;
	ConfigMarket.logWriter.log(getName() + ": Finish. ", LogPrinter.INFO);
}
}

