/// <summary> /// Creates a new thread /// </summary> public Thread() { TID = NextTID++; Context = new X86ThreadContext(); m_currentSignalContext = null; m_signalMutex = new Mutex(); }
/// <summary> /// Processes a signal /// </summary> /// <param name="action">The action</param> /// <returns>The signal context</returns> public void ProcessSignal(SignalAction action) { while (m_currentSignalContext != null) { Tasking.Yield(); } m_signalMutex.Lock(); m_currentSignalContext = Context.ProcessSignal(action); m_signalMutex.Unlock(); }
/// <summary> /// Returns from a signal (restores original context) /// </summary> public unsafe void ReturnFromSignal() { m_signalMutex.Lock(); if (m_currentSignalContext == null) { m_signalMutex.Unlock(); return; } Context.ReturnFromSignal(m_currentSignalContext); m_currentSignalContext.Dispose(); Heap.Free(m_currentSignalContext); m_currentSignalContext = null; m_signalMutex.Unlock(); }
/// <summary> /// Returns from signal (restores original context) /// </summary> /// <param name="oldContext">Old context</param> public void ReturnFromSignal(ISignalContext oldContext) { X86SignalContext old = (X86SignalContext)oldContext; Memory.Memcpy(m_sysRegs, old.Sysregs, sizeof(RegsDirect)); }