Skip to content

Commit 46ff091

Browse files
committed
Use a counter based condition variable implementation
1 parent cce6352 commit 46ff091

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

lib/picos_std.sync/conditions.ml

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
open Picos
22
open Picos_std_awaitable
33

4-
type t = unit Awaitable.t
4+
type t = int Awaitable.t
55

6-
let create ?padded () = Awaitable.make ?padded ()
6+
let create ?padded () = Awaitable.make ?padded 0
77

88
let[@inline] wait t lock ~acquire ~release =
9-
let trigger = Trigger.create () in
10-
let awaiter = Awaitable.Awaiter.add t trigger in
9+
let before = Awaitable.get t in
1110
release lock;
1211
let lock_forbidden lock =
1312
let fiber = Fiber.current () in
@@ -20,12 +19,17 @@ let[@inline] wait t lock ~acquire ~release =
2019
Fiber.set fiber ~forbid;
2120
Printexc.raise_with_backtrace exn bt
2221
in
23-
match Trigger.await trigger with
24-
| None -> lock_forbidden lock
25-
| Some exn_bt ->
26-
Awaitable.Awaiter.remove awaiter;
22+
match if Awaitable.get t == before then Awaitable.await t before with
23+
| () -> lock_forbidden lock
24+
| exception exn ->
25+
let bt = Printexc.get_raw_backtrace () in
2726
lock_forbidden lock;
28-
Printexc.raise_with_backtrace (fst exn_bt) (snd exn_bt)
27+
Printexc.raise_with_backtrace exn bt
2928

30-
let signal = Awaitable.signal
31-
let broadcast = Awaitable.broadcast
29+
let signal t =
30+
Awaitable.incr t;
31+
Awaitable.signal t
32+
33+
let broadcast t =
34+
Awaitable.incr t;
35+
Awaitable.broadcast t

0 commit comments

Comments
 (0)