package vm;
import javax.scj.util.Const;
import icecaptools.IcecapCVar;
import icecaptools.IcecapCompileMe;
import devices.CR16C.KT4585.CR16CInterruptDispatcher;
import devices.i86.I86InterruptDispatcher;
/* Add setScheduler(Scheduler sch) */
public class ClockInterruptHandler implements InterruptHandler, ProcessLogic {
private Process currentProcess;
private vm.Scheduler scheduler;
@IcecapCVar
private static boolean hvmClockReady;
private static byte disableCount = 1;
@Override
@IcecapCompileMe
public void run() {
while (true) {
currentProcess = (Process) scheduler.getNextProcess();
enable();
handlerProcess.transferTo(currentProcess);
}
}
@Override
public void catchError(Throwable t) {
Const.reporter.schedulerError(t);
}
private Process handlerProcess;
private ClockInterruptHandler(Scheduler scheduler, int[] stack) {
setScheduler(scheduler);
handlerProcess = new vm.Process(this, stack);
handlerProcess.initialize();
}
@IcecapCompileMe
@Override
public void handle() {
disable();
currentProcess.transferTo(handlerProcess);
}
@IcecapCompileMe
@Override
public void disable() {
disableCount++;
hvmClockReady = false;
}
@IcecapCompileMe
@Override
public void enable() {
disableCount--;
if (disableCount == 0) {
hvmClockReady = true;
}
}
public static ClockInterruptHandler instance;
@IcecapCompileMe
public static void initialize(Scheduler scheduler, int[] stack) {
switch (Machine.architecture) {
case Machine.X86_64:
case Machine.X86_32:
I86InterruptDispatcher.init();
break;
case Machine.CR16_C:
CR16CInterruptDispatcher.init();
break;
}
instance = new ClockInterruptHandler(scheduler, stack);
}
public void yield() {
handle();
}
@Override
public void register() {
InterruptDispatcher
.registerHandler(this, InterruptDispatcher.HVM_CLOCK);
}
public void startClockHandler(Process process) {
this.currentProcess = process;
}
public void setScheduler(Scheduler sch) {
this.scheduler = sch;
if (Machine.getCurrentScheduler() == sch) {
/* Hack to force inclusion of service methods */
/* This code should never actually be executed */
Monitor.notify(null);
Monitor.wait(null);
Monitor.notifyAll(null);
}
Machine.setCurrentScheduler(sch);
}
}