Skip to content

Commit 05fc7f7

Browse files
polytypicedwintorok
andcommitted
Specify Spawn more strictly with respect to cancelation
Co-authored-by: Edwin Török <[email protected]>
1 parent 9f446e7 commit 05fc7f7

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

lib/picos/intf.ocaml5.ml

+23-16
Original file line numberDiff line numberDiff line change
@@ -133,22 +133,29 @@ module type Fiber = sig
133133
(** Schedulers must handle the {!Spawn} effect to implement the behavior of
134134
{!spawn}.
135135
136-
In case the fiber permits propagation of cancelation and the computation
137-
associated with the fiber has been canceled the scheduler is free to
138-
discontinue the fiber immediately before spawning new fibers.
139-
140-
The scheduler is free to run the newly created fiber on any domain and
141-
decide which fiber to give priority to.
142-
143-
⚠️ The scheduler should guarantee that, when [Spawn] returns normally, the
144-
given [main] will eventually be called by the scheduler and, when [Spawn]
145-
raises an exception, the [main] will not be called. In other words,
146-
[Spawn] should check cancelation just once and be all or nothing.
147-
Furthermore, in case a newly spawned fiber is canceled before its main is
148-
called, the scheduler must still call the main. This allows a program to
149-
ensure, i.e. keep track of, that all fibers it spawns are terminated
150-
properly and any resources transmitted to spawned fibers will be disposed
151-
properly. *)
136+
The scheduler is free to run the newly created fiber on any domain or
137+
thread and decide which fiber to give priority to.
138+
139+
⚠️ In case the fiber performing {!Spawn} permits propagation of cancelation
140+
and the computation associated with the fiber has been canceled before it
141+
performed {!Spawn}, the scheduler should discontinue the current fiber and
142+
not spawn a new fiber. If cancelation happens during the handling of
143+
{!Spawn} the scheduler is free to either spawn a new fiber, in which case
144+
the current fiber must be continued normally, or not spawn a fiber, in
145+
which case the current fibers must be discontinued, i.e. {!spawn} raises
146+
an exception.
147+
148+
⚠️ The scheduler should guarantee that, when the {!Spawn} handler continues
149+
the fiber normally, the given [main] will eventually be called by the
150+
scheduler and, when spawn discontinues the fiber, the [main] will not be
151+
called.
152+
153+
In other words, spawn should (effectively) check cancelation at least once
154+
and be all or nothing. Furthermore, in case a newly spawned fiber is
155+
canceled before its [main] is called, the scheduler must still call the
156+
[main]. This allows a program to ensure, i.e. keep track of, that all
157+
fibers it spawns are terminated properly and any resources transmitted to
158+
spawned fibers will be disposed properly. *)
152159
type _ Effect.t +=
153160
private
154161
| Spawn : { fiber : t; main : t -> unit } -> unit Effect.t

0 commit comments

Comments
 (0)