@@ -58,17 +58,6 @@ type t = {
5858 mutable run : bool ;
5959}
6060
61- let fiber_key : Fiber.Maybe.t ref Picos_thread.TLS.t =
62- Picos_thread.TLS. create ()
63-
64- let get () =
65- match Picos_thread.TLS. get_exn fiber_key with
66- | p -> p
67- | exception Picos_thread.TLS. Not_set ->
68- let p = ref Fiber.Maybe. nothing in
69- Picos_thread.TLS. set fiber_key p;
70- p
71-
7261let [@ inline] relaxed_wakeup t ~known_not_empty =
7362 if
7463 t.num_waiters_non_zero
@@ -79,24 +68,24 @@ let[@inline] relaxed_wakeup t ~known_not_empty =
7968 Condition. signal t.condition
8069 end
8170
82- let exec p t = function
71+ let exec ( p : Per_thread.t ) t = function
8372 | Spawn (fiber , main ) ->
84- p := Fiber.Maybe. of_fiber fiber;
73+ p.current < - Fiber.Maybe. of_fiber fiber;
8574 Effect.Deep. match_with main fiber t.handler
8675 | Raise (fiber , k , exn , bt ) ->
87- p := Fiber.Maybe. of_fiber fiber;
76+ p.current < - Fiber.Maybe. of_fiber fiber;
8877 Effect.Deep. discontinue_with_backtrace k exn bt
8978 | Return (fiber , k ) ->
90- p := Fiber.Maybe. of_fiber fiber;
79+ p.current < - Fiber.Maybe. of_fiber fiber;
9180 Effect.Deep. continue k ()
9281 | Current (fiber , k ) ->
93- p := Fiber.Maybe. of_fiber fiber;
82+ p.current < - Fiber.Maybe. of_fiber fiber;
9483 Effect.Deep. continue k fiber
9584 | Continue (fiber , k ) ->
96- p := Fiber.Maybe. of_fiber fiber;
85+ p.current < - Fiber.Maybe. of_fiber fiber;
9786 Fiber. continue fiber k ()
9887 | Resume (fiber , k ) ->
99- p := Fiber.Maybe. of_fiber fiber;
88+ p.current < - Fiber.Maybe. of_fiber fiber;
10089 Fiber. resume fiber k
10190
10291let rec next p t =
@@ -105,7 +94,7 @@ let rec next p t =
10594 relaxed_wakeup t ~known_not_empty: false ;
10695 exec p t ready
10796 | exception Not_found ->
108- p := Fiber.Maybe. nothing;
97+ p.current < - Fiber.Maybe. nothing;
10998 if Atomic. get t.num_alive_fibers <> 0 then begin
11099 Mutex. lock t.mutex;
111100 let n = ! (t.num_waiters) + 1 in
@@ -190,22 +179,22 @@ let context ?fatal_exn_handler () =
190179 and current =
191180 Some
192181 (fun k ->
193- let p = Picos_thread.TLS. get_exn fiber_key in
194- let fiber = Fiber.Maybe. to_fiber ! p in
182+ let p = Per_thread. get () in
183+ let fiber = Fiber.Maybe. to_fiber p.current in
195184 Collection. push t.ready (Current (fiber, k));
196185 next p t)
197186 and yield =
198187 Some
199188 (fun k ->
200- let p = Picos_thread.TLS. get_exn fiber_key in
201- let fiber = Fiber.Maybe. to_fiber ! p in
189+ let p = Per_thread. get () in
190+ let fiber = Fiber.Maybe. to_fiber p.current in
202191 Collection. push t.ready (Continue (fiber, k));
203192 next p t)
204193 and return =
205194 Some
206195 (fun k ->
207- let p = Picos_thread.TLS. get_exn fiber_key in
208- let fiber = Fiber.Maybe. to_fiber ! p in
196+ let p = Per_thread. get () in
197+ let fiber = Fiber.Maybe. to_fiber p.current in
209198 Collection. push t.ready (Return (fiber, k));
210199 next p t)
211200 and handler = { retc; exnc; effc }
@@ -214,8 +203,8 @@ let context ?fatal_exn_handler () =
214203 function
215204 | Fiber .Current -> t .current
216205 | Fiber .Spawn r ->
217- let p = Picos_thread.TLS. get_exn fiber_key in
218- let fiber = Fiber.Maybe. to_fiber ! p in
206+ let p = Per_thread. get () in
207+ let fiber = Fiber.Maybe. to_fiber p.current in
219208 if Fiber. is_canceled fiber then t.yield
220209 else begin
221210 Atomic. incr t.num_alive_fibers;
@@ -225,8 +214,8 @@ let context ?fatal_exn_handler () =
225214 end
226215 | Fiber. Yield -> t.yield
227216 | Computation. Cancel_after r -> begin
228- let p = Picos_thread.TLS. get_exn fiber_key in
229- let fiber = Fiber.Maybe. to_fiber ! p in
217+ let p = Per_thread. get () in
218+ let fiber = Fiber.Maybe. to_fiber p.current in
230219 if Fiber. is_canceled fiber then t.yield
231220 else
232221 match
@@ -243,8 +232,8 @@ let context ?fatal_exn_handler () =
243232 | Trigger. Await trigger ->
244233 Some
245234 (fun k ->
246- let p = Picos_thread.TLS. get_exn fiber_key in
247- let fiber = Fiber.Maybe. to_fiber ! p in
235+ let p = Per_thread. get () in
236+ let fiber = Fiber.Maybe. to_fiber p.current in
248237 if Fiber. try_suspend fiber trigger fiber k t.resume then next p t
249238 else begin
250239 Collection. push t.ready (Resume (fiber, k));
@@ -253,14 +242,14 @@ let context ?fatal_exn_handler () =
253242 | _ -> None
254243 and retc () =
255244 Atomic. decr t.num_alive_fibers;
256- let p = Picos_thread.TLS. get_exn fiber_key in
245+ let p = Per_thread. get () in
257246 next p t
258247 in
259248 t
260249
261250let runner_on_this_thread t =
262251 Select. check_configured () ;
263- next (get () ) t
252+ next (Per_thread. get () ) t
264253
265254let rec await t =
266255 if t.num_waiters_non_zero then begin
@@ -289,7 +278,7 @@ let run_fiber ?context:t_opt fiber main =
289278 t.run < - true ;
290279 Mutex. unlock t.mutex;
291280 Collection. push t.ready (Spawn (fiber, main));
292- next (get () ) t;
281+ next (Per_thread. get () ) t;
293282 Mutex. lock t.mutex;
294283 await t
295284 end
0 commit comments