Skip to content

Commit ce2815c

Browse files
perf(moonbit): compact async task state storage (#1665)
1 parent 6b3ec40 commit ce2815c

7 files changed

Lines changed: 213 additions & 234 deletions

File tree

crates/moonbit/src/async/coroutine.mbt

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ priv enum State {
2323
///|
2424
struct Coroutine {
2525
coro_id : Int
26-
waitable_set : WaitableSet
26+
lane : TaskLane
2727
mut state : State
2828
mut shielded : Bool
2929
mut cancelled : Bool
@@ -47,7 +47,7 @@ fn Coroutine::wake(self : Coroutine) -> Unit {
4747
if !self.ready {
4848
self.ready = true
4949
enqueue(self)
50-
signal_component_task(self.waitable_set)
50+
signal_component_task(self.lane)
5151
}
5252
}
5353

@@ -69,6 +69,10 @@ pub(all) suberror Cancelled derive(Debug)
6969

7070
///|
7171
fn Coroutine::cancel(self : Coroutine) -> Unit {
72+
match self.state {
73+
Done | Fail(_) => return
74+
Running | Suspend(_) => ()
75+
}
7276
self.cancelled = true
7377
if !self.shielded {
7478
self.wake()
@@ -81,10 +85,9 @@ async fn suspend() -> Unit {
8185
if coro.cancelled && !coro.shielded {
8286
raise Cancelled::Cancelled
8387
}
84-
let schedule = task_schedule(coro.waitable_set)
85-
schedule.blocking += 1
88+
coro.lane.blocking += 1
8689
defer {
87-
schedule.blocking -= 1
90+
coro.lane.blocking -= 1
8891
}
8992
async_suspend(fn(ok_cont, err_cont) {
9093
guard coro.state is Running
@@ -95,7 +98,7 @@ async fn suspend() -> Unit {
9598
///|
9699
fn spawn_owned(
97100
f : async () -> Unit,
98-
waitable_set : WaitableSet,
101+
lane : TaskLane,
99102
inherited_spawner : ((async () -> Unit) -> Unit)?,
100103
) -> Coroutine {
101104
scheduler.coro_id += 1
@@ -105,7 +108,7 @@ fn spawn_owned(
105108
shielded: true,
106109
downstream: Set([]),
107110
coro_id: scheduler.coro_id,
108-
waitable_set,
111+
lane,
109112
cancelled: false,
110113
spawner: inherited_spawner,
111114
}
@@ -132,8 +135,12 @@ fn spawn_owned(
132135
///|
133136
fn spawn(f : async () -> Unit) -> Coroutine {
134137
match scheduler.curr_coro {
135-
Some(parent) => spawn_owned(f, parent.waitable_set, parent.spawner)
136-
None => spawn_owned(f, current_waitableset(), None)
138+
Some(parent) => spawn_owned(f, parent.lane, parent.spawner)
139+
None => {
140+
let waitable_set = current_waitableset()
141+
let task_state = component_task_state(waitable_set).unwrap()
142+
spawn_owned(f, task_state.lane, None)
143+
}
137144
}
138145
}
139146

0 commit comments

Comments
 (0)