private CPUUpdateResult Resume(LuaArgs args) { try { // Setup m_updateResult = CPUUpdateResult.Continue; m_nextBootMount.Value = null; // Resume var results = m_mainRoutine.Resume(args); // Update event filter m_eventFilter.Clear(); for (int i = 0; i < results.Length; ++i) { if (results.IsNil(i)) { break; } else if (results.IsString(i)) { m_eventFilter.Add(results.GetString(i)); } else { m_eventFilter.Add(null); } } // Handle result if (m_mainRoutine.IsFinished) { Halt(); return(m_isMainCPU ? CPUUpdateResult.Shutdown : m_updateResult); } else { if (m_updateResult == CPUUpdateResult.Continue) { m_machine.CollectGarbage(); } return(m_updateResult); } } catch (LuaError e) { var bootPath = new FilePath("boot.lua"); m_computer.ErrorOutput.WriteLine("Error resuming {0}: {1}", bootPath, e.Message); Halt(); return(m_isMainCPU ? CPUUpdateResult.Shutdown : m_updateResult); } }
private DeviceUpdateResult HandleUpdateResult(CPUUpdateResult result) { switch (result) { case CPUUpdateResult.Continue: default: { return(DeviceUpdateResult.Continue); } case CPUUpdateResult.Reboot: { return(DeviceUpdateResult.Reboot); } case CPUUpdateResult.Shutdown: { return(DeviceUpdateResult.Shutdown); } case CPUUpdateResult.Halt: { if (!Halted) { Halt(); } return(DeviceUpdateResult.Continue); } case CPUUpdateResult.Boot: { if (!Halted) { Halt(); } return(HandleUpdateResult(ReallyBoot(m_nextBootMount.Value))); } } }
internal void RequestReboot() { m_updateResult = CPUUpdateResult.Reboot; }
internal void RequestShutdown() { m_updateResult = CPUUpdateResult.Shutdown; }
internal void RequestBoot(LuaMount mount) { m_updateResult = CPUUpdateResult.Boot; m_nextBootMount.Value = mount; }
internal void RequestHalt() { m_updateResult = CPUUpdateResult.Halt; }