private bool RunThread(Thread t) { uint id = t.id; CurrentThread = id; NucleusCalls.YieldTo(id); return(true); }
private void ThreadMain(uint id) { Thread t = threadTable[id]; CompilerIntrinsics.Sti(); t.start.Run(); CompilerIntrinsics.Cli(); t.alive = false; NucleusCalls.YieldTo(0); // Should never be reached: NucleusCalls.DebugPrintHex(0, 0xdead0002); while (true) { } }
public override void Run() { int nIter = 1048576; if (me == 0) { myId = Kernel.CurrentThread; Thread otherT = kernel.NewThread(other); uint otherId = otherT.id; kernel.Yield(); try { CompilerIntrinsics.Cli(); NucleusCalls.DebugPrintHex(50, 0); long t1 = NucleusCalls.Rdtsc(); for (int i = 0; i < nIter; i++) { NucleusCalls.YieldTo(otherId); } long t2 = NucleusCalls.Rdtsc(); uint diff = (uint)((t2 - t1) >> 20); NucleusCalls.DebugPrintHex(50, diff); } finally { CompilerIntrinsics.Sti(); } doneSemaphore.Signal(); } else { uint otherId = other.myId; kernel.Yield(); try { CompilerIntrinsics.Cli(); for (int i = 0; i < nIter; i++) { NucleusCalls.YieldTo(otherId); } } finally { CompilerIntrinsics.Sti(); } } }