/** * The thread module provides support for thread creation and management. * * Copyright: Copyright Sean Kelly 2005 - 2012. * License: Distributed under the * $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0). * (See accompanying file LICENSE) * Authors: Sean Kelly, Walter Bright, Alex Rønne Petersen, Martin Nowak * Source: $(DRUNTIMESRC core/thread/package.d) */ module core.thread.context; struct StackContext { void* bstack, tstack; /// Slot for the EH implementation to keep some state for each stack /// (will be necessary for exception chaining, etc.). Opaque as far as /// we are concerned here. void* ehContext; StackContext* within; StackContext* next, prev; } struct Callable { void opAssign(void function() fn) pure nothrow @nogc @safe { () @trusted { m_fn = fn; }(); m_type = Call.FN; } void opAssign(void delegate() dg) pure nothrow @nogc @safe { () @trusted { m_dg = dg; }(); m_type = Call.DG; } void opCall() { switch (m_type) { case Call.FN: m_fn(); break; case Call.DG: m_dg(); break; default: break; } } private: enum Call { NO, FN, DG } Call m_type = Call.NO; union { void function() m_fn; void delegate() m_dg; } }