| /** | |
| * 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/context.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; | |
| } | |
| } |