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