package builtin.thread;
import builtin.BuiltinSub;
import gui.Constants;
import gui.Heap;
import gui.Interpreter;
import gui.MintException;
import gui.Pointer;
import gui.PointerTools;
import gui.SmartList;
import gui.Subprogram;
/**
*
* @author Oliver Chu
*/
public class StartThread extends BuiltinSub {
@Override
public Pointer apply(SmartList<Pointer> args) throws MintException {
Subprogram s = PointerTools.dereferenceSub(args.get(0));
Interpreter i = PointerTools.dereferenceInterpreter(args.get(1));
Threadable th = new Threadable(s, i);
Thread t = new Thread(th);
t.start();
Heap.keepThread(t);
return Constants.MINT_NULL;
}
private class Threadable implements Runnable {
private Subprogram sub;
private Interpreter interp;
public Threadable(Subprogram s, Interpreter i) {
sub = s;
interp = i;
}
@Override
public void run() {
try {
sub.execute(interp.getEnv(), interp.getImports(),
new SmartList<Pointer>(), interp);
} catch (MintException ex) {
System.err.println(ex.getMessage());
}
}
}
}