package tests;
import tcl.lang.*;
/*
This class is designed to test a deadlock condition in the
tcl.lang.Notifier class. There was a problem with deadlocking
if a vwait was entered through the Notifier loop, it would
keep other events from being queued up. This class is used
in tcljava/TclEvent.test in test TclEvent-1.4.
*/
public class AppendEventQueueThread extends Thread {
private Interp interpInOtherThread;
public final int expectedNumQueued = 5;
public int numQueued = 0;
public int numProcessed = 0;
private static final boolean debug = false;
public AppendEventQueueThread(Interp i) {
interpInOtherThread = i;
}
public void run() {
if (debug) {
System.out.println("running AppendEventQueueThread");
}
for (int i = 0; i < expectedNumQueued ; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
TclEvent event = new TclEvent() {
public int processEvent (int flags) {
numProcessed++;
if (debug) {
System.out.println("processed event " + numProcessed);
}
return 1;
}
};
// Add the event to the thread safe event queue
interpInOtherThread.getNotifier().queueEvent(event, TCL.QUEUE_TAIL);
numQueued++;
if (debug) {
System.out.println("queued event " + numQueued);
}
}
if (debug) {
System.out.println("done running AppendEventQueueThread");
}
}
public static void queueVwaitEvent(final Interp interp) {
TclEvent event = new TclEvent() {
public int processEvent (int flags) {
try {
interp.eval("after 10000 {set wait 1}", 0);
interp.eval("vwait wait", 0);
} catch (TclException ex) {
ex.printStackTrace();
}
return 1;
}
};
// Add the event to the thread safe event queue
interp.getNotifier().queueEvent(event, TCL.QUEUE_TAIL);
if (debug) {
System.out.println("queued vwait event");
}
}
}