@@ -23,7 +23,7 @@ priv enum State {
2323///|
2424struct 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///|
7171fn 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///|
9699fn 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///|
133136fn 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