@@ -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,18 +68,16 @@ let[@inline] relaxed_wakeup t ~known_not_empty =
79
68
Condition. signal t.condition
80
69
end
81
70
82
- let exec p t ready =
83
- begin
84
- p :=
85
- match ready with
86
- | Spawn (fiber, _)
87
- | Raise (fiber, _, _, _)
88
- | Return (fiber, _)
89
- | Current (fiber, _)
90
- | Continue (fiber, _)
91
- | Resume (fiber , _ ) ->
92
- Fiber.Maybe. of_fiber fiber
93
- end ;
71
+ let exec (p : Fiber.Per_thread.t ) t ready =
72
+ p.current < -
73
+ (match ready with
74
+ | Spawn (fiber, _)
75
+ | Raise (fiber, _, _, _)
76
+ | Return (fiber, _)
77
+ | Current (fiber, _)
78
+ | Continue (fiber, _)
79
+ | Resume (fiber , _ ) ->
80
+ Fiber.Maybe. of_fiber fiber);
94
81
match ready with
95
82
| Spawn (fiber , main ) -> Effect.Deep. match_with main fiber t.handler
96
83
| Raise (_ , k , exn , bt ) -> Effect.Deep. discontinue_with_backtrace k exn bt
@@ -105,7 +92,7 @@ let rec next p t =
105
92
relaxed_wakeup t ~known_not_empty: false ;
106
93
exec p t ready
107
94
| exception Not_found ->
108
- p := Fiber.Maybe. nothing;
95
+ p.current < - Fiber.Maybe. nothing;
109
96
if Atomic. get t.num_alive_fibers <> 0 then begin
110
97
Mutex. lock t.mutex;
111
98
let n = ! (t.num_waiters) + 1 in
@@ -192,30 +179,30 @@ let context ?fatal_exn_handler () =
192
179
t.current < -
193
180
Some
194
181
(fun k ->
195
- let p = Picos_thread.TLS. get_exn fiber_key in
196
- let fiber = Fiber.Maybe. to_fiber ! p in
182
+ let p = Fiber.Per_thread. get () in
183
+ let fiber = Fiber.Maybe. to_fiber p.current in
197
184
Collection. push t.ready (Current (fiber, k));
198
185
next p t);
199
186
t.yield < -
200
187
Some
201
188
(fun k ->
202
- let p = Picos_thread.TLS. get_exn fiber_key in
203
- let fiber = Fiber.Maybe. to_fiber ! p in
189
+ let p = Fiber.Per_thread. get () in
190
+ let fiber = Fiber.Maybe. to_fiber p.current in
204
191
Collection. push t.ready (Continue (fiber, k));
205
192
next p t);
206
193
t.return < -
207
194
Some
208
195
(fun k ->
209
- let p = Picos_thread.TLS. get_exn fiber_key in
210
- let fiber = Fiber.Maybe. to_fiber ! p in
196
+ let p = Fiber.Per_thread. get () in
197
+ let fiber = Fiber.Maybe. to_fiber p.current in
211
198
Collection. push t.ready (Return (fiber, k));
212
199
next p t);
213
200
t.handler < -
214
201
{
215
202
retc =
216
203
(fun () ->
217
204
Atomic. decr t.num_alive_fibers;
218
- let p = Picos_thread.TLS. get_exn fiber_key in
205
+ let p = Fiber.Per_thread. get () in
219
206
next p t);
220
207
exnc;
221
208
effc =
@@ -224,8 +211,8 @@ let context ?fatal_exn_handler () =
224
211
match e with
225
212
| Fiber. Current -> t.current
226
213
| Fiber. Spawn r ->
227
- let p = Picos_thread.TLS. get_exn fiber_key in
228
- let fiber = Fiber.Maybe. to_fiber ! p in
214
+ let p = Fiber.Per_thread. get () in
215
+ let fiber = Fiber.Maybe. to_fiber p.current in
229
216
if Fiber. is_canceled fiber then t.yield
230
217
else begin
231
218
Atomic. incr t.num_alive_fibers;
@@ -235,8 +222,8 @@ let context ?fatal_exn_handler () =
235
222
end
236
223
| Fiber. Yield -> t.yield
237
224
| Computation. Cancel_after r -> begin
238
- let p = Picos_thread.TLS. get_exn fiber_key in
239
- let fiber = Fiber.Maybe. to_fiber ! p in
225
+ let p = Fiber.Per_thread. get () in
226
+ let fiber = Fiber.Maybe. to_fiber p.current in
240
227
if Fiber. is_canceled fiber then t.yield
241
228
else
242
229
match
@@ -254,8 +241,8 @@ let context ?fatal_exn_handler () =
254
241
| Trigger. Await trigger ->
255
242
Some
256
243
(fun k ->
257
- let p = Picos_thread.TLS. get_exn fiber_key in
258
- let fiber = Fiber.Maybe. to_fiber ! p in
244
+ let p = Fiber.Per_thread. get () in
245
+ let fiber = Fiber.Maybe. to_fiber p.current in
259
246
if Fiber. try_suspend fiber trigger fiber k t.resume then
260
247
next p t
261
248
else begin
@@ -268,7 +255,7 @@ let context ?fatal_exn_handler () =
268
255
269
256
let runner_on_this_thread t =
270
257
Select. check_configured () ;
271
- next (get () ) t
258
+ next (Fiber.Per_thread. get () ) t
272
259
273
260
let rec await t =
274
261
if t.num_waiters_non_zero then begin
@@ -296,7 +283,8 @@ let run_fiber ?context:t_opt fiber main =
296
283
else begin
297
284
t.run < - true ;
298
285
Mutex. unlock t.mutex;
299
- get () := Fiber.Maybe. of_fiber fiber;
286
+ let p = Fiber.Per_thread. get () in
287
+ p.current < - Fiber.Maybe. of_fiber fiber;
300
288
Effect.Deep. match_with main fiber t.handler;
301
289
Mutex. lock t.mutex;
302
290
await t
0 commit comments