@@ -53,21 +53,43 @@ let get_flock fiber =
53
53
| Bundle _ as t -> t
54
54
| Nothing -> no_flock ()
55
55
56
- let await (type a ) (Bundle r as t : t ) fiber packed canceler outer
57
- (pass : a pass ) =
56
+ let await (Bundle r as t : t ) fiber packed canceler outer =
58
57
decr t;
59
58
Fiber. set_computation fiber packed;
60
59
let forbid = Fiber. exchange fiber ~forbid: true in
61
60
Trigger. await r.finished |> ignore;
62
61
Fiber. set fiber ~forbid ;
63
- begin
64
- match pass with FLS -> Fiber.FLS. set fiber flock_key outer | Arg -> ()
65
- end ;
62
+ if Fiber.FLS. get fiber flock_key ~default: Nothing != outer then
63
+ Fiber.FLS. set fiber flock_key outer;
66
64
let (Packed parent) = packed in
67
65
Computation. detach parent canceler;
68
66
Control.Errors. check r.errors;
69
67
Fiber. check fiber
70
68
69
+ let [@ inline never] raised exn t fiber packed canceler outer =
70
+ let bt = Printexc. get_raw_backtrace () in
71
+ error t exn bt;
72
+ await t fiber packed canceler outer;
73
+ Printexc. raise_with_backtrace exn bt
74
+
75
+ let [@ inline never] returned value (Bundle r as t : t ) fiber packed canceler
76
+ outer =
77
+ let config = Atomic. get r.config in
78
+ if config land config_terminated_bit <> 0 then begin
79
+ let callstack =
80
+ let n = (config land config_callstack_mask) lsr config_callstack_shift in
81
+ if n = 0 then None else Some n
82
+ in
83
+ terminate ?callstack t
84
+ end ;
85
+ await t fiber packed canceler outer;
86
+ value
87
+
88
+ let join_after_realloc x fn t fiber packed canceler outer =
89
+ match fn x with
90
+ | value -> returned value t fiber packed canceler outer
91
+ | exception exn -> raised exn t fiber packed canceler outer
92
+
71
93
let join_after_pass (type a ) ?callstack ?on_return (fn : a -> _ ) (pass : a pass )
72
94
=
73
95
(* The sequence of operations below ensures that nothing is leaked. *)
@@ -93,38 +115,20 @@ let join_after_pass (type a) ?callstack ?on_return (fn : a -> _) (pass : a pass)
93
115
Bundle { config; bundle; errors; finished }
94
116
in
95
117
let fiber = Fiber. current () in
96
- let outer =
97
- match pass with
98
- | Arg -> Nothing
99
- | FLS -> Fiber.FLS. get fiber flock_key ~default: Nothing
100
- in
118
+ let outer = Fiber.FLS. get fiber flock_key ~default: Nothing in
119
+ begin
120
+ match pass with FLS -> Fiber.FLS. reserve fiber flock_key | Arg -> ()
121
+ end ;
101
122
let (Packed parent as packed) = Fiber. get_computation fiber in
102
123
let (Packed bundle) = r.bundle in
103
124
let canceler = Computation. attach_canceler ~from: parent ~into: bundle in
104
125
(* Ideally there should be no poll point betweem [attach_canceler] and the
105
- [match ... with] below. *)
106
- match
107
- Fiber. set_computation fiber r.bundle;
108
- fn (match pass with FLS -> Fiber.FLS. set fiber flock_key t | Arg -> t)
109
- with
110
- | value ->
111
- let config = Atomic. get r.config in
112
- if config land config_terminated_bit <> 0 then begin
113
- let callstack =
114
- let n =
115
- (config land config_callstack_mask) lsr config_callstack_shift
116
- in
117
- if n = 0 then None else Some n
118
- in
119
- terminate ?callstack t
120
- end ;
121
- await t fiber packed canceler outer pass;
122
- value
123
- | exception exn ->
124
- let bt = Printexc. get_raw_backtrace () in
125
- error t exn bt;
126
- await t fiber packed canceler outer pass;
127
- Printexc. raise_with_backtrace exn bt
126
+ [match ... with] in [join_after_realloc]. *)
127
+ Fiber. set_computation fiber r.bundle;
128
+ let x : a =
129
+ match pass with FLS -> Fiber.FLS. set fiber flock_key t | Arg -> t
130
+ in
131
+ join_after_realloc x fn t fiber packed canceler outer
128
132
129
133
let rec incr (Bundle r as t : t ) backoff =
130
134
let before = Atomic. get r.config in
@@ -136,14 +140,12 @@ let finish (Bundle { bundle = Packed bundle; _ } as t : t) canceler =
136
140
Computation. detach bundle canceler;
137
141
decr t
138
142
139
- (* * This helps to reduce CPU stack usage with the native compiler. *)
140
143
let [@ inline never] raised exn child t canceler =
141
144
let bt = Printexc. get_raw_backtrace () in
142
145
Computation. cancel child exn bt;
143
146
error t exn bt;
144
147
finish t canceler
145
148
146
- (* * This helps to reduce CPU stack usage with the native compiler. *)
147
149
let [@ inline never] returned value child t canceler =
148
150
Computation. return child value;
149
151
finish t canceler
@@ -181,14 +183,12 @@ let fork_as_promise_pass (type a) (Bundle r as t : t) thunk (pass : a pass) =
181
183
decr t;
182
184
raise canceled_exn
183
185
184
- (* * This helps to reduce CPU stack usage with the native compiler. *)
185
186
let [@ inline never] raised_flock exn fiber =
186
187
let t = get_flock fiber in
187
188
let bt = Printexc. get_raw_backtrace () in
188
189
error t exn bt;
189
190
decr t
190
191
191
- (* * This helps to reduce CPU stack usage with the native compiler. *)
192
192
let [@ inline never] raised_bundle exn t =
193
193
error t exn (Printexc. get_raw_backtrace () );
194
194
decr t
0 commit comments