@@ -53,7 +53,16 @@ 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
56
+ let fiber_key : Fiber.Maybe.t ref Picos_thread.TLS.t =
57
+ Picos_thread.TLS. create ()
58
+
59
+ let get () =
60
+ match Picos_thread.TLS. get_exn fiber_key with
61
+ | p -> p
62
+ | exception Picos_thread.TLS. Not_set ->
63
+ let p = ref Fiber.Maybe. nothing in
64
+ Picos_thread.TLS. set fiber_key p;
65
+ p
57
66
58
67
let rec next p t =
59
68
match Collection. pop_exn t.ready with
@@ -158,21 +167,21 @@ let context ?fatal_exn_handler () =
158
167
and current =
159
168
Some
160
169
(fun k ->
161
- let p = Picos_thread.TLS. get fiber_key in
170
+ let p = Picos_thread.TLS. get_exn fiber_key in
162
171
let fiber = Fiber.Maybe. to_fiber ! p in
163
172
Collection. push t.ready (Current (fiber, k));
164
173
next p t)
165
174
and yield =
166
175
Some
167
176
(fun k ->
168
- let p = Picos_thread.TLS. get fiber_key in
177
+ let p = Picos_thread.TLS. get_exn fiber_key in
169
178
let fiber = Fiber.Maybe. to_fiber ! p in
170
179
Collection. push t.ready (Continue (fiber, k));
171
180
next p t)
172
181
and return =
173
182
Some
174
183
(fun k ->
175
- let p = Picos_thread.TLS. get fiber_key in
184
+ let p = Picos_thread.TLS. get_exn fiber_key in
176
185
let fiber = Fiber.Maybe. to_fiber ! p in
177
186
Collection. push t.ready (Return (fiber, k));
178
187
next p t)
@@ -182,7 +191,7 @@ let context ?fatal_exn_handler () =
182
191
function
183
192
| Fiber .Current -> t .current
184
193
| Fiber .Spawn r ->
185
- let p = Picos_thread.TLS. get fiber_key in
194
+ let p = Picos_thread.TLS. get_exn fiber_key in
186
195
let fiber = Fiber.Maybe. to_fiber ! p in
187
196
if Fiber. is_canceled fiber then t.yield
188
197
else begin
@@ -193,7 +202,7 @@ let context ?fatal_exn_handler () =
193
202
end
194
203
| Fiber. Yield -> t.yield
195
204
| Computation. Cancel_after r -> begin
196
- let p = Picos_thread.TLS. get fiber_key in
205
+ let p = Picos_thread.TLS. get_exn fiber_key in
197
206
let fiber = Fiber.Maybe. to_fiber ! p in
198
207
if Fiber. is_canceled fiber then t.yield
199
208
else
@@ -211,7 +220,7 @@ let context ?fatal_exn_handler () =
211
220
| Trigger. Await trigger ->
212
221
Some
213
222
(fun k ->
214
- let p = Picos_thread.TLS. get fiber_key in
223
+ let p = Picos_thread.TLS. get_exn fiber_key in
215
224
let fiber = Fiber.Maybe. to_fiber ! p in
216
225
if Fiber. try_suspend fiber trigger fiber k t.resume then next p t
217
226
else begin
@@ -221,14 +230,14 @@ let context ?fatal_exn_handler () =
221
230
| _ -> None
222
231
and retc () =
223
232
Atomic. decr t.num_alive_fibers;
224
- let p = Picos_thread.TLS. get fiber_key in
233
+ let p = Picos_thread.TLS. get_exn fiber_key in
225
234
next p t
226
235
in
227
236
t
228
237
229
238
let runner_on_this_thread t =
230
239
Select. check_configured () ;
231
- next (Picos_thread.TLS. get fiber_key ) t
240
+ next (get () ) t
232
241
233
242
let rec await t =
234
243
if ! (t.num_waiters_non_zero) then begin
@@ -257,7 +266,7 @@ let run_fiber ?context:t_opt fiber main =
257
266
t.run < - true ;
258
267
Mutex. unlock t.mutex;
259
268
Collection. push t.ready (Spawn (fiber, main));
260
- next (Picos_thread.TLS. get fiber_key ) t;
269
+ next (get () ) t;
261
270
Mutex. lock t.mutex;
262
271
await t
263
272
end
0 commit comments