@@ -58,17 +58,6 @@ type t = {
58
58
mutable run : bool ;
59
59
}
60
60
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
-
72
61
let [@ inline] relaxed_wakeup t ~known_not_empty =
73
62
if
74
63
t.num_waiters_non_zero
@@ -79,24 +68,24 @@ let[@inline] relaxed_wakeup t ~known_not_empty =
79
68
Condition. signal t.condition
80
69
end
81
70
82
- let exec p t = function
71
+ let exec ( p : Per_thread.t ) t = function
83
72
| Spawn (fiber , main ) ->
84
- p := Fiber.Maybe. of_fiber fiber;
73
+ p.current < - Fiber.Maybe. of_fiber fiber;
85
74
Effect.Deep. match_with main fiber t.handler
86
75
| Raise (fiber , k , exn , bt ) ->
87
- p := Fiber.Maybe. of_fiber fiber;
76
+ p.current < - Fiber.Maybe. of_fiber fiber;
88
77
Effect.Deep. discontinue_with_backtrace k exn bt
89
78
| Return (fiber , k ) ->
90
- p := Fiber.Maybe. of_fiber fiber;
79
+ p.current < - Fiber.Maybe. of_fiber fiber;
91
80
Effect.Deep. continue k ()
92
81
| Current (fiber , k ) ->
93
- p := Fiber.Maybe. of_fiber fiber;
82
+ p.current < - Fiber.Maybe. of_fiber fiber;
94
83
Effect.Deep. continue k fiber
95
84
| Continue (fiber , k ) ->
96
- p := Fiber.Maybe. of_fiber fiber;
85
+ p.current < - Fiber.Maybe. of_fiber fiber;
97
86
Fiber. continue fiber k ()
98
87
| Resume (fiber , k ) ->
99
- p := Fiber.Maybe. of_fiber fiber;
88
+ p.current < - Fiber.Maybe. of_fiber fiber;
100
89
Fiber. resume fiber k
101
90
102
91
let rec next p t =
@@ -105,7 +94,7 @@ let rec next p t =
105
94
relaxed_wakeup t ~known_not_empty: false ;
106
95
exec p t ready
107
96
| exception Not_found ->
108
- p := Fiber.Maybe. nothing;
97
+ p.current < - Fiber.Maybe. nothing;
109
98
if Atomic. get t.num_alive_fibers <> 0 then begin
110
99
Mutex. lock t.mutex;
111
100
let n = ! (t.num_waiters) + 1 in
@@ -190,22 +179,22 @@ let context ?fatal_exn_handler () =
190
179
and current =
191
180
Some
192
181
(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
195
184
Collection. push t.ready (Current (fiber, k));
196
185
next p t)
197
186
and yield =
198
187
Some
199
188
(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
202
191
Collection. push t.ready (Continue (fiber, k));
203
192
next p t)
204
193
and return =
205
194
Some
206
195
(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
209
198
Collection. push t.ready (Return (fiber, k));
210
199
next p t)
211
200
and handler = { retc; exnc; effc }
@@ -214,8 +203,8 @@ let context ?fatal_exn_handler () =
214
203
function
215
204
| Fiber .Current -> t .current
216
205
| 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
219
208
if Fiber. is_canceled fiber then t.yield
220
209
else begin
221
210
Atomic. incr t.num_alive_fibers;
@@ -225,8 +214,8 @@ let context ?fatal_exn_handler () =
225
214
end
226
215
| Fiber. Yield -> t.yield
227
216
| 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
230
219
if Fiber. is_canceled fiber then t.yield
231
220
else
232
221
match
@@ -243,8 +232,8 @@ let context ?fatal_exn_handler () =
243
232
| Trigger. Await trigger ->
244
233
Some
245
234
(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
248
237
if Fiber. try_suspend fiber trigger fiber k t.resume then next p t
249
238
else begin
250
239
Collection. push t.ready (Resume (fiber, k));
@@ -253,14 +242,14 @@ let context ?fatal_exn_handler () =
253
242
| _ -> None
254
243
and retc () =
255
244
Atomic. decr t.num_alive_fibers;
256
- let p = Picos_thread.TLS. get_exn fiber_key in
245
+ let p = Per_thread. get () in
257
246
next p t
258
247
in
259
248
t
260
249
261
250
let runner_on_this_thread t =
262
251
Select. check_configured () ;
263
- next (get () ) t
252
+ next (Per_thread. get () ) t
264
253
265
254
let rec await t =
266
255
if t.num_waiters_non_zero then begin
@@ -289,7 +278,7 @@ let run_fiber ?context:t_opt fiber main =
289
278
t.run < - true ;
290
279
Mutex. unlock t.mutex;
291
280
Collection. push t.ready (Spawn (fiber, main));
292
- next (get () ) t;
281
+ next (Per_thread. get () ) t;
293
282
Mutex. lock t.mutex;
294
283
await t
295
284
end
0 commit comments