1 /**
2  * The thread module provides support for thread creation and management.
3  *
4  * Copyright: Copyright Sean Kelly 2005 - 2012.
5  * License: Distributed under the
6  *      $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
7  *    (See accompanying file LICENSE)
8  * Authors:   Sean Kelly, Walter Bright, Alex Rønne Petersen, Martin Nowak
9  * Source:    $(DRUNTIMESRC core/thread/context.d)
10  */
11 
12 module core.thread.context;
13 
14 struct StackContext
15 {
16     void* bstack, tstack;
17 
18     /// Slot for the EH implementation to keep some state for each stack
19     /// (will be necessary for exception chaining, etc.). Opaque as far as
20     /// we are concerned here.
21     void* ehContext;
22     StackContext* within;
23     StackContext* next, prev;
24 }
25 
26 struct Callable
27 {
28     void opAssign(void function() fn) pure nothrow @nogc @safe
29     {
30         () @trusted { m_fn = fn; }();
31         m_type = Call.FN;
32     }
33     void opAssign(void delegate() dg) pure nothrow @nogc @safe
34     {
35         () @trusted { m_dg = dg; }();
36         m_type = Call.DG;
37     }
38     void opCall()
39     {
40         switch (m_type)
41         {
42             case Call.FN:
43                 m_fn();
44                 break;
45             case Call.DG:
46                 m_dg();
47                 break;
48             default:
49                 break;
50         }
51     }
52 private:
53     enum Call
54     {
55         NO,
56         FN,
57         DG
58     }
59     Call m_type = Call.NO;
60     union
61     {
62         void function() m_fn;
63         void delegate() m_dg;
64     }
65 }