@@ -53,21 +53,43 @@ let get_flock fiber =
5353 | Bundle _ as t -> t
5454 | Nothing -> no_flock ()
5555
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 =
5857 decr t;
5958 Fiber. set_computation fiber packed;
6059 let forbid = Fiber. exchange fiber ~forbid: true in
6160 Trigger. await r.finished |> ignore;
6261 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;
6664 let (Packed parent) = packed in
6765 Computation. detach parent canceler;
6866 Control.Errors. check r.errors;
6967 Fiber. check fiber
7068
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+
7193let join_after_pass (type a ) ?callstack ?on_return (fn : a -> _ ) (pass : a pass )
7294 =
7395 (* 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)
93115 Bundle { config; bundle; errors; finished }
94116 in
95117 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 ;
101122 let (Packed parent as packed) = Fiber. get_computation fiber in
102123 let (Packed bundle) = r.bundle in
103124 let canceler = Computation. attach_canceler ~from: parent ~into: bundle in
104125 (* 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
128132
129133let rec incr (Bundle r as t : t ) backoff =
130134 let before = Atomic. get r.config in
@@ -136,14 +140,12 @@ let finish (Bundle { bundle = Packed bundle; _ } as t : t) canceler =
136140 Computation. detach bundle canceler;
137141 decr t
138142
139- (* * This helps to reduce CPU stack usage with the native compiler. *)
140143let [@ inline never] raised exn child t canceler =
141144 let bt = Printexc. get_raw_backtrace () in
142145 Computation. cancel child exn bt;
143146 error t exn bt;
144147 finish t canceler
145148
146- (* * This helps to reduce CPU stack usage with the native compiler. *)
147149let [@ inline never] returned value child t canceler =
148150 Computation. return child value;
149151 finish t canceler
@@ -181,14 +183,12 @@ let fork_as_promise_pass (type a) (Bundle r as t : t) thunk (pass : a pass) =
181183 decr t;
182184 raise canceled_exn
183185
184- (* * This helps to reduce CPU stack usage with the native compiler. *)
185186let [@ inline never] raised_flock exn fiber =
186187 let t = get_flock fiber in
187188 let bt = Printexc. get_raw_backtrace () in
188189 error t exn bt;
189190 decr t
190191
191- (* * This helps to reduce CPU stack usage with the native compiler. *)
192192let [@ inline never] raised_bundle exn t =
193193 error t exn (Printexc. get_raw_backtrace () );
194194 decr t
0 commit comments