File: context.d

package info (click to toggle)
gcc-arm-none-eabi 15%3A12.2.rel1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 959,712 kB
  • sloc: cpp: 3,275,382; ansic: 2,061,766; ada: 840,956; f90: 208,513; makefile: 76,132; asm: 73,433; xml: 50,448; exp: 34,146; sh: 32,436; objc: 15,637; fortran: 14,012; python: 11,991; pascal: 6,787; awk: 4,779; perl: 3,054; yacc: 338; ml: 285; lex: 201; haskell: 122
file content (65 lines) | stat: -rw-r--r-- 1,494 bytes parent folder | download | duplicates (2)
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;
    }
}