aboutsummaryrefslogtreecommitdiff
path: root/book/en/src/internals/non-reentrancy.md
blob: 408a012e55364869774537737ec0aa49de37a935 (plain) (blame)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Non-reentrancy

In RTFM, tasks handlers are *not* reentrant. Reentering a task handler can break
Rust aliasing rules and lead to *undefined behavior*. A task handler can be
reentered in one of two ways: in software or by hardware.

## In software

To reenter a task handler in software its underlying interrupt handler must be
invoked using FFI (see example below). FFI requires `unsafe` code so end users
are discouraged from directly invoking an interrupt handler.

``` rust
#[rtfm::app(device = ..)]
const APP: () = {
    static mut X: u64 = 0;

    #[init]
    fn init(c: init::Context) { .. }

    #[interrupt(binds = UART0, resources = [X])]
    fn foo(c: foo::Context) {
        let x: &mut u64 = c.resources.X;

        *x = 1;

        //~ `bar` can preempt `foo` at this point

        *x = 2;

        if *x == 2 {
            // something
        }
    }

    #[interrupt(binds = UART1, priority = 2)]
    fn bar(c: foo::Context) {
        extern "C" {
            fn UART0();
        }

        // this interrupt handler will invoke task handler `foo` resulting
        // in mutable aliasing of the static variable `X`
        unsafe { UART0() }
    }
};
```

The RTFM framework must generate the interrupt handler code that calls the user
defined task handlers. We are careful in making these handlers `unsafe` and / or
impossible to call from user code.

The above example expands into:

``` rust
fn foo(c: foo::Context) {
    // .. user code ..
}

fn bar(c: bar::Context) {
    // .. user code ..
}

const APP: () = {
    // everything in this block is not visible to user code

    #[no_mangle]
    unsafe fn USART0() {
        foo(..);
    }

    #[no_mangle]
    unsafe fn USART1() {
        bar(..);
    }
};
```

## By hardware

A task handler can also be reentered without software intervention. This can
occur if the same handler is assigned to two or more interrupts in the vector
table but there's no syntax for this kind of configuration in the RTFM
framework.
ypes/mock'>types/mock Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
path: root/src/js/node/timers.promises.js (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2023-09-21Update completions listGravatar Colin McDonnell 1-0/+2
2023-09-21Update install docsGravatar Colin McDonnell 1-6/+14
2023-09-21Update test scriptGravatar Colin McDonnell 2-2/+4
2023-09-21Add docs for extending process.envGravatar Colin McDonnell 1-0/+25
2023-09-21decorator metadata defaults and rest argsGravatar Dylan Conway 2-9/+72
2023-09-21Fix test failures (#5862)Gravatar Jarred Sumner 5-19/+24
2023-09-21On Linux, respect memory limit from cgroups (#5849)Gravatar Jarred Sumner 8-58/+89
2023-09-21Revert "feat(encoding): support BOM detection (#5550)"Gravatar Jarred Sumner 5-70/+8
2023-09-21Don't await pluginsGravatar Jarred Sumner 2-2/+2
2023-09-21Add another testGravatar Jarred Sumner 1-0/+5
2023-09-21Fixes #5859jarred/5859Gravatar Jarred Sumner 2-6/+55
2023-09-21Regenerate builtinsGravatar Jarred Sumner 3-5009/+5009
2023-09-21Fix `make jsc` on Linux (#4779)Gravatar Aaron Dewes 1-1/+1
2023-09-21PrettierGravatar Jarred Sumner 1-11/+10
2023-09-20fix: add check to sqlite extension loading logic (#5773)Gravatar Liz 2-0/+9
2023-09-20fix(console.log): change default depth from 8 to 2 (#5839)Gravatar Jibran Kalia 3-1/+22
2023-09-20In http client, use .toOwnedSlice() instead of potentially re-using the WTFSt...Gravatar Jarred Sumner 1-4/+7
2023-09-20fix(fetch): fix redirect in relative path location. (#5781)Gravatar Ai Hoshino 2-14/+106
2023-09-20remove /test.js and git ignore it - sorryGravatar dave caruso 2-1/+1
2023-09-20docs(project): development fix Arch install-dependencies command (#5270)Gravatar saurabh 1-1/+1
2023-09-20fix(run): interpret extensionless files as typescript (#5711)Gravatar dave caruso 13-19/+76
2023-09-20fix(ffi) fix size limit for dlopen (#5516)Gravatar Ciro Spaciari 8-5016/+5306
2023-09-20feat(encoding): support BOM detection (#5550)Gravatar WingLim 5-8/+71
2023-09-20feat(node:dns): implement `dns.lookupService` (#5613)Gravatar Ai Hoshino 6-9/+492
2023-09-20implement `Module.prototype._compile` (#5840)Gravatar dave caruso 4-2/+78
2023-09-20feat(runtime): implement `console._stdout` (#5842)Gravatar dave caruso 2-1/+59
2023-09-20Improve types for `test.each`, `describe.each` (#5838)Gravatar Colin McDonnell 2-10/+59
2023-09-20Fix rendering of bun.lockb in vscode extensionGravatar Ashcon Partovi 5-114/+4
2023-09-20Run bun fmtGravatar Ashcon Partovi 2-12/+9
2023-09-20Update quickstartGravatar Colin McDonnell 1-0/+19
2023-09-20Update prisma guideGravatar Colin McDonnell 1-0/+6
2023-09-20Update env docGravatar Colin McDonnell 1-1/+1
2023-09-20Clarify hot modeGravatar Colin McDonnell 1-10/+9
2023-09-20[bun install] Add `-E` as alias of `--exact` (#5104)Gravatar Jonah Snider 2-2/+57
2023-09-20feat: switch disableTelemetry to bunfig (#5690)Gravatar Lucas Coratger 3-1/+14
2023-09-20Treat `undefined` value as empty in expect.toThrow (#5788)Gravatar LongYinan 1-3/+3
2023-09-20Fix various bugs in vscode extension (#5772)Gravatar JeremyFunk 3-9/+85
2023-09-20add `emitDecoratorMetadata` (#5777)Gravatar Dylan Conway 19-110/+1884
2023-09-20fix(doc): correct `server.reload` (#5799)Gravatar Ai Hoshino 1-1/+1
2023-09-20Call `Error.prepareStackTrace` on `new Error().stack` (#5802)Gravatar Jarred Sumner 6-155/+277
2023-09-20Fixes #5800Gravatar Jarred Sumner 1-1/+1
2023-09-20Fix path used in bunx (#5785)Gravatar Jarred Sumner 2-26/+51
2023-09-20Fix RedirectURLTooLong errors (#5786)Gravatar ggobbe 1-1/+1
2023-09-19Show when a newer version is available in the install screen (#5780)Gravatar Jarred Sumner 3-14/+95
2023-09-19Fix broken linksGravatar Colin McDonnell 4-4/+4