Skip to content

Commit 44f67c5

Browse files
committed
And tweak more for performance
1 parent 9ab7b9f commit 44f67c5

File tree

3 files changed

+56
-58
lines changed

3 files changed

+56
-58
lines changed

lib/picos_mux.fifo/picos_mux_fifo.ml

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type ready =
88
| Resume of
99
Fiber.t
1010
* ((exn * Printexc.raw_backtrace) option, unit) Effect.Deep.continuation
11-
| Return of Fiber.Maybe.t * (unit, unit) Effect.Deep.continuation
11+
| Return of Fiber.t * (unit, unit) Effect.Deep.continuation
1212

1313
module Mpscq = Picos_aux_mpscq
1414

@@ -35,22 +35,21 @@ type t = {
3535

3636
let rec next t =
3737
match Mpscq.pop_exn t.ready with
38-
| Spawn (fiber, main) ->
39-
t.fiber <- Fiber.Maybe.of_fiber fiber;
38+
| ready -> begin
4039
t.remaining_quota <- t.quota;
41-
Effect.Deep.match_with main fiber t.handler
42-
| Return (fiber, k) ->
43-
t.fiber <- fiber;
44-
t.remaining_quota <- t.quota;
45-
Effect.Deep.continue k ()
46-
| Continue (fiber, k) ->
47-
t.fiber <- Fiber.Maybe.of_fiber fiber;
48-
t.remaining_quota <- t.quota;
49-
Fiber.continue fiber k ()
50-
| Resume (fiber, k) ->
51-
t.fiber <- Fiber.Maybe.of_fiber fiber;
52-
t.remaining_quota <- t.quota;
53-
Fiber.resume fiber k
40+
t.fiber <-
41+
(match ready with
42+
| Spawn (fiber, _)
43+
| Continue (fiber, _)
44+
| Resume (fiber, _)
45+
| Return (fiber, _) ->
46+
Fiber.Maybe.of_fiber fiber);
47+
match ready with
48+
| Spawn (fiber, main) -> Effect.Deep.match_with main fiber t.handler
49+
| Return (_, k) -> Effect.Deep.continue k ()
50+
| Continue (fiber, k) -> Fiber.continue fiber k ()
51+
| Resume (fiber, k) -> Fiber.resume fiber k
52+
end
5453
| exception Mpscq.Empty ->
5554
t.fiber <- Fiber.Maybe.nothing;
5655
if t.num_alive_fibers <> 0 then begin
@@ -84,7 +83,7 @@ let run_fiber ?quota ?fatal_exn_handler:(exnc : _ = raise) fiber main =
8483
let rec t =
8584
{
8685
ready;
87-
fiber = Fiber.Maybe.nothing;
86+
fiber = Fiber.Maybe.of_fiber fiber;
8887
needs_wakeup;
8988
mutex;
9089
condition;
@@ -118,7 +117,7 @@ let run_fiber ?quota ?fatal_exn_handler:(exnc : _ = raise) fiber main =
118117
Effect.Deep.continue k ()
119118
end
120119
else begin
121-
Mpscq.push t.ready (Return (t.fiber, k));
120+
Mpscq.push t.ready (Return (Fiber.Maybe.to_fiber t.fiber, k));
122121
next t
123122
end)
124123
and discontinue =
@@ -187,8 +186,7 @@ let run_fiber ?quota ?fatal_exn_handler:(exnc : _ = raise) fiber main =
187186
Condition.broadcast t.condition
188187
end
189188
in
190-
Mpscq.push t.ready (Spawn (fiber, main));
191-
next t
189+
Effect.Deep.match_with main fiber t.handler
192190

193191
let run ?quota ?fatal_exn_handler ?(forbid = false) main =
194192
let computation = Computation.create ~mode:`LIFO () in

lib/picos_mux.multififo/picos_mux_multififo.ml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ type ready =
1212
| Resume of
1313
Fiber.t
1414
* ((exn * Printexc.raw_backtrace) option, unit) Effect.Deep.continuation
15-
| Return of Fiber.Maybe.t * (unit, unit) Effect.Deep.continuation
15+
| Return of Fiber.t * (unit, unit) Effect.Deep.continuation
1616

1717
type t = {
1818
mutable num_waiters_non_zero : bool;
@@ -101,19 +101,18 @@ let[@inline] relaxed_wakeup t ~known_not_empty ready =
101101

102102
let exec ready (Per_thread p : per_thread) t =
103103
p.remaining_quota <- t.quota;
104+
p.fiber <-
105+
(match ready with
106+
| Spawn (fiber, _)
107+
| Return (fiber, _)
108+
| Continue (fiber, _)
109+
| Resume (fiber, _) ->
110+
Fiber.Maybe.of_fiber fiber);
104111
match ready with
105-
| Spawn (fiber, main) ->
106-
p.fiber <- Fiber.Maybe.of_fiber fiber;
107-
Effect.Deep.match_with main fiber t.handler
108-
| Return (fiber, k) ->
109-
p.fiber <- fiber;
110-
Effect.Deep.continue k ()
111-
| Continue (fiber, k) ->
112-
p.fiber <- Fiber.Maybe.of_fiber fiber;
113-
Fiber.continue fiber k ()
114-
| Resume (fiber, k) ->
115-
p.fiber <- Fiber.Maybe.of_fiber fiber;
116-
Fiber.resume fiber k
112+
| Spawn (fiber, main) -> Effect.Deep.match_with main fiber t.handler
113+
| Return (_, k) -> Effect.Deep.continue k ()
114+
| Continue (fiber, k) -> Fiber.continue fiber k ()
115+
| Resume (fiber, k) -> Fiber.resume fiber k
117116

118117
let rec next (Per_thread p as pt : per_thread) =
119118
match Mpmcq.pop_exn p.ready with
@@ -229,7 +228,7 @@ let per_thread context =
229228
Effect.Deep.continue k ()
230229
end
231230
else begin
232-
Mpmcq.push p.ready (Return (p.fiber, k));
231+
Mpmcq.push p.ready (Return (Fiber.Maybe.to_fiber p.fiber, k));
233232
next pt
234233
end)
235234
and discontinue =
@@ -391,7 +390,7 @@ let runner_on_this_thread t =
391390

392391
let run_fiber ?context:t_opt fiber main =
393392
let t = match t_opt with None -> context () | Some t -> t in
394-
with_per_thread t @@ fun (Per_thread p as pt) ->
393+
with_per_thread t @@ fun (Per_thread p) ->
395394
Mutex.lock t.mutex;
396395
if t.run then begin
397396
Mutex.unlock t.mutex;
@@ -401,8 +400,9 @@ let run_fiber ?context:t_opt fiber main =
401400
t.run <- true;
402401
Mutex.unlock t.mutex
403402
end;
404-
Mpmcq.push p.ready (Spawn (fiber, main));
405-
next pt
403+
p.remaining_quota <- t.quota;
404+
p.fiber <- Fiber.Maybe.of_fiber fiber;
405+
Effect.Deep.match_with main fiber t.handler
406406

407407
let run ?context ?(forbid = false) main =
408408
let computation = Computation.create ~mode:`LIFO () in

lib/picos_mux.random/picos_mux_random.ml

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -79,25 +79,25 @@ let[@inline] relaxed_wakeup t ~known_not_empty =
7979
Condition.signal t.condition
8080
end
8181

82-
let exec p t = function
83-
| Spawn (fiber, main) ->
84-
p := Fiber.Maybe.of_fiber fiber;
85-
Effect.Deep.match_with main fiber t.handler
86-
| Raise (fiber, k, exn, bt) ->
87-
p := Fiber.Maybe.of_fiber fiber;
88-
Effect.Deep.discontinue_with_backtrace k exn bt
89-
| Return (fiber, k) ->
90-
p := Fiber.Maybe.of_fiber fiber;
91-
Effect.Deep.continue k ()
92-
| Current (fiber, k) ->
93-
p := Fiber.Maybe.of_fiber fiber;
94-
Effect.Deep.continue k fiber
95-
| Continue (fiber, k) ->
96-
p := Fiber.Maybe.of_fiber fiber;
97-
Fiber.continue fiber k ()
98-
| Resume (fiber, k) ->
99-
p := Fiber.Maybe.of_fiber fiber;
100-
Fiber.resume fiber k
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;
94+
match ready with
95+
| Spawn (fiber, main) -> Effect.Deep.match_with main fiber t.handler
96+
| Raise (_, k, exn, bt) -> Effect.Deep.discontinue_with_backtrace k exn bt
97+
| Return (_, k) -> Effect.Deep.continue k ()
98+
| Current (fiber, k) -> Effect.Deep.continue k fiber
99+
| Continue (fiber, k) -> Fiber.continue fiber k ()
100+
| Resume (fiber, k) -> Fiber.resume fiber k
101101

102102
let rec next p t =
103103
match Collection.pop_exn t.ready with
@@ -288,8 +288,8 @@ let run_fiber ?context:t_opt fiber main =
288288
else begin
289289
t.run <- true;
290290
Mutex.unlock t.mutex;
291-
Collection.push t.ready (Spawn (fiber, main));
292-
next (get ()) t;
291+
get () := Fiber.Maybe.of_fiber fiber;
292+
Effect.Deep.match_with main fiber t.handler;
293293
Mutex.lock t.mutex;
294294
await t
295295
end

0 commit comments

Comments
 (0)