@@ -58,16 +58,19 @@ module Timeout = struct
5858 let [@ inline] set_opt state seconds =
5959 if seconds != None then set_opt state seconds
6060
61- let [@ inline never] await state release =
61+ let [@ inline never] await state sue =
6262 match fenceless_get state with
6363 | Call _ as alive ->
64- if Atomic. compare_and_set state alive (Call release) then alive
64+ if
65+ Atomic. compare_and_set state alive
66+ (Call (fun () -> Single_use_event. signal sue))
67+ then alive
6568 else timeout ()
6669 | Unset | Elapsed -> timeout ()
6770
68- let [@ inline] await state release =
71+ let [@ inline] await state sue =
6972 let alive = fenceless_get state in
70- if alive == Unset then Unset else await state release
73+ if alive == Unset then Unset else await state sue
7174
7275 let [@ inline never] unawait state alive =
7376 match fenceless_get state with
@@ -114,9 +117,9 @@ end = struct
114117 x
115118end
116119
117- type awaiter = unit -> unit
120+ type awaiter = Single_use_event .t
118121
119- let [@ inline] resume_awaiter awaiter = awaiter ()
122+ let [@ inline] resume_awaiter awaiter = Single_use_event. signal awaiter
120123
121124let [@ inline] resume_awaiters = function
122125 | [] -> ()
@@ -408,7 +411,8 @@ let add_awaiter loc before awaiter =
408411 let awaiters = awaiter :: state_old.awaiters in
409412 { before; after = before; casn = casn_after; awaiters }
410413 in
411- before == eval state_old
414+ Single_use_event. is_initial awaiter
415+ && before == eval state_old
412416 && Atomic. compare_and_set (as_atomic loc) state_old state_new
413417
414418let [@ tail_mod_cons] rec remove_first x' removed = function
@@ -429,12 +433,12 @@ let rec remove_awaiter loc before awaiter =
429433 remove_awaiter loc before awaiter
430434
431435let block timeout loc before =
432- let t = Domain_local_await. prepare_for_await () in
433- let alive = Timeout. await timeout t.release in
434- if add_awaiter loc before t.release then begin
435- try t .await ()
436+ let t = Single_use_event. create () in
437+ let alive = Timeout. await timeout t in
438+ if add_awaiter loc before t then begin
439+ try Single_use_event . await t
436440 with cancellation_exn ->
437- remove_awaiter loc before t.release ;
441+ remove_awaiter loc before t;
438442 Timeout. cancel_alive alive;
439443 raise cancellation_exn
440444 end ;
@@ -969,22 +973,22 @@ module Xt = struct
969973 commit (Backoff. once backoff) mode (reset_quick xt) tx
970974 | exception Retry. Later -> begin
971975 if xt.cass == NIL then invalid_retry () ;
972- let t = Domain_local_await. prepare_for_await () in
973- let alive = Timeout. await (timeout_as_atomic xt) t.release in
974- match add_awaiters t.release xt.casn xt.cass with
976+ let t = Single_use_event. create () in
977+ let alive = Timeout. await (timeout_as_atomic xt) t in
978+ match add_awaiters t xt.casn xt.cass with
975979 | NIL -> begin
976- match t .await () with
980+ match Single_use_event . await t with
977981 | () ->
978- remove_awaiters t.release xt.casn NIL xt.cass;
982+ remove_awaiters t xt.casn NIL xt.cass;
979983 Timeout. unawait (timeout_as_atomic xt) alive;
980984 commit (Backoff. reset backoff) mode (reset_quick xt) tx
981985 | exception cancellation_exn ->
982- remove_awaiters t.release xt.casn NIL xt.cass;
986+ remove_awaiters t xt.casn NIL xt.cass;
983987 Timeout. cancel_alive alive;
984988 raise cancellation_exn
985989 end
986990 | CASN _ as stop ->
987- remove_awaiters t.release xt.casn stop xt.cass;
991+ remove_awaiters t xt.casn stop xt.cass;
988992 Timeout. unawait (timeout_as_atomic xt) alive;
989993 commit (Backoff. once backoff) mode (reset_quick xt) tx
990994 end
0 commit comments