aboutsummaryrefslogtreecommitdiff
path: root/libphobos/libdruntime/core/thread/context.d
blob: e477269b8492ef3613a0718a45c69bd8a9089953 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
 * 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;
    }
}