@@ -53,30 +53,28 @@ type t = {
53
53
mutable run : bool ;
54
54
}
55
55
56
- let fiber_key = Picos_thread.TLS. new_key @@ fun () -> ref Fiber.Maybe. nothing
57
-
58
- let rec next p t =
56
+ let rec next (p : Per_thread.t ) t =
59
57
match Collection. pop_exn t.ready with
60
58
| Spawn (fiber , main ) ->
61
- p := Fiber.Maybe. of_fiber fiber;
59
+ p.current < - Fiber.Maybe. of_fiber fiber;
62
60
Effect.Deep. match_with main fiber t.handler
63
61
| Raise (fiber , k , exn_bt ) ->
64
- p := Fiber.Maybe. of_fiber fiber;
62
+ p.current < - Fiber.Maybe. of_fiber fiber;
65
63
Exn_bt. discontinue k exn_bt
66
64
| Return (fiber , k ) ->
67
- p := Fiber.Maybe. of_fiber fiber;
65
+ p.current < - Fiber.Maybe. of_fiber fiber;
68
66
Effect.Deep. continue k ()
69
67
| Current (fiber , k ) ->
70
- p := Fiber.Maybe. of_fiber fiber;
68
+ p.current < - Fiber.Maybe. of_fiber fiber;
71
69
Effect.Deep. continue k fiber
72
70
| Continue (fiber , k ) ->
73
- p := Fiber.Maybe. of_fiber fiber;
71
+ p.current < - Fiber.Maybe. of_fiber fiber;
74
72
Fiber. continue fiber k ()
75
73
| Resume (fiber , k ) ->
76
- p := Fiber.Maybe. of_fiber fiber;
74
+ p.current < - Fiber.Maybe. of_fiber fiber;
77
75
Fiber. resume fiber k
78
76
| exception Not_found ->
79
- p := Fiber.Maybe. nothing;
77
+ p.current < - Fiber.Maybe. nothing;
80
78
if Atomic. get t.num_alive_fibers <> 0 then begin
81
79
Mutex. lock t.mutex;
82
80
if Collection. is_empty t.ready && Atomic. get t.num_alive_fibers <> 0
@@ -158,22 +156,22 @@ let context ?fatal_exn_handler () =
158
156
and current =
159
157
Some
160
158
(fun k ->
161
- let p = Picos_thread.TLS. get fiber_key in
162
- let fiber = Fiber.Maybe. to_fiber ! p in
159
+ let p = Per_thread. get () in
160
+ let fiber = Fiber.Maybe. to_fiber p.current in
163
161
Collection. push t.ready (Current (fiber, k));
164
162
next p t)
165
163
and yield =
166
164
Some
167
165
(fun k ->
168
- let p = Picos_thread.TLS. get fiber_key in
169
- let fiber = Fiber.Maybe. to_fiber ! p in
166
+ let p = Per_thread. get () in
167
+ let fiber = Fiber.Maybe. to_fiber p.current in
170
168
Collection. push t.ready (Continue (fiber, k));
171
169
next p t)
172
170
and return =
173
171
Some
174
172
(fun k ->
175
- let p = Picos_thread.TLS. get fiber_key in
176
- let fiber = Fiber.Maybe. to_fiber ! p in
173
+ let p = Per_thread. get () in
174
+ let fiber = Fiber.Maybe. to_fiber p.current in
177
175
Collection. push t.ready (Return (fiber, k));
178
176
next p t)
179
177
and handler = { retc; exnc; effc }
@@ -182,8 +180,8 @@ let context ?fatal_exn_handler () =
182
180
function
183
181
| Fiber .Current -> t .current
184
182
| Fiber .Spawn r ->
185
- let p = Picos_thread.TLS. get fiber_key in
186
- let fiber = Fiber.Maybe. to_fiber ! p in
183
+ let p = Per_thread. get () in
184
+ let fiber = Fiber.Maybe. to_fiber p.current in
187
185
if Fiber. is_canceled fiber then t.yield
188
186
else begin
189
187
Atomic. incr t.num_alive_fibers;
@@ -193,8 +191,8 @@ let context ?fatal_exn_handler () =
193
191
end
194
192
| Fiber. Yield -> t.yield
195
193
| Computation. Cancel_after r -> begin
196
- let p = Picos_thread.TLS. get fiber_key in
197
- let fiber = Fiber.Maybe. to_fiber ! p in
194
+ let p = Per_thread. get () in
195
+ let fiber = Fiber.Maybe. to_fiber p.current in
198
196
if Fiber. is_canceled fiber then t.yield
199
197
else
200
198
match
@@ -211,8 +209,8 @@ let context ?fatal_exn_handler () =
211
209
| Trigger. Await trigger ->
212
210
Some
213
211
(fun k ->
214
- let p = Picos_thread.TLS. get fiber_key in
215
- let fiber = Fiber.Maybe. to_fiber ! p in
212
+ let p = Per_thread. get () in
213
+ let fiber = Fiber.Maybe. to_fiber p.current in
216
214
if Fiber. try_suspend fiber trigger fiber k t.resume then next p t
217
215
else begin
218
216
Collection. push t.ready (Resume (fiber, k));
@@ -221,14 +219,14 @@ let context ?fatal_exn_handler () =
221
219
| _ -> None
222
220
and retc () =
223
221
Atomic. decr t.num_alive_fibers;
224
- let p = Picos_thread.TLS. get fiber_key in
222
+ let p = Per_thread. get () in
225
223
next p t
226
224
in
227
225
t
228
226
229
227
let runner_on_this_thread t =
230
228
Select. check_configured () ;
231
- next (Picos_thread.TLS. get fiber_key ) t
229
+ next (Per_thread. get () ) t
232
230
233
231
let rec await t =
234
232
if ! (t.num_waiters_non_zero) then begin
@@ -257,7 +255,7 @@ let run_fiber ?context:t_opt fiber main =
257
255
t.run < - true ;
258
256
Mutex. unlock t.mutex;
259
257
Collection. push t.ready (Spawn (fiber, main));
260
- next (Picos_thread.TLS. get fiber_key ) t;
258
+ next (Per_thread. get () ) t;
261
259
Mutex. lock t.mutex;
262
260
await t
263
261
end
0 commit comments