@@ -261,19 +261,21 @@ let sync c = _sync (Unifier.deref c)
261261let pending_clocks = WeakQueue. create ()
262262let clocks = Queue. create ()
263263
264- let rec _cleanup ~ clock { outputs } =
265- Queue. iter outputs (fun (a , o ) -> try o#sleep a with _ -> () );
264+ let rec has_stopped ~ clear_controller ~ clock ~ c x =
265+ Queue. iter x. outputs (fun (a , o ) -> try o#sleep a with _ -> () );
266266 Queue. iter clock.sub_clocks stop;
267- Queue. filter_out clocks (fun c -> Unifier. deref c == clock)
267+ Queue. filter_out clocks (fun c -> Unifier. deref c == clock);
268+ if clear_controller then Unifier. set clock.controller `None ;
269+ Atomic. set clock.state (`Stopped x.sync);
270+ WeakQueue. push pending_clocks c;
271+ x.log#important " Clock stopped"
268272
269273and stop c =
270274 let clock = Unifier. deref c in
271275 match Atomic. get clock.state with
272276 | `Stopped _ | `Stopping _ -> ()
273277 | `Started ({ sync = `Passive } as x ) ->
274- _cleanup ~clock x;
275- x.log#important " Clock stopped" ;
276- Atomic. set clock.state (`Stopped `Passive )
278+ has_stopped ~clear_controller: false ~clock ~c x
277279 | `Started x ->
278280 x.log#important " Clock stopping" ;
279281 Atomic. set clock.state (`Stopping x)
@@ -554,7 +556,7 @@ and _tick ~clock x =
554556 _after_tick ~self_sync x;
555557 check_stopped ()
556558
557- and _clock_thread ~clock x =
559+ and _clock_thread ~clock ~ c x =
558560 let has_sources_to_process () =
559561 0 < Queue. length clock.pending_activations
560562 || 0 < Queue. length x.outputs
@@ -579,8 +581,7 @@ and _clock_thread ~clock x =
579581 [] reasons
580582 in
581583 x.log#important " Clock thread has stopped: %s." (String. concat " , " reasons);
582- _cleanup ~clock x;
583- Atomic. set clock.state (`Stopped x.sync)
584+ has_stopped ~clear_controller: true ~clock ~c x
584585 in
585586 let run () =
586587 try
@@ -613,7 +614,7 @@ and _can_start ?(force = false) clock =
613614 `True sync
614615 | _ -> `False
615616
616- and _start ?force ~sync clock =
617+ and _start ?force ~sync ~ c clock =
617618 _set_id clock (_id clock);
618619 let id = _id clock in
619620 let sources =
@@ -675,7 +676,7 @@ and _start ?force ~sync clock =
675676 Queue .iter clock .sub_clocks (fun c -> start ?force c );
676677 Atomic .set clock .state (`Started x );
677678 if sync <> `Passive then (
678- let th = _clock_thread ~clock x in
679+ let th = _clock_thread ~clock ~c x in
679680 match _controller with
680681 | `None ->
681682 let controller =
@@ -689,7 +690,7 @@ and _start ?force ~sync clock =
689690and start ?force c =
690691 let clock = Unifier. deref c in
691692 match _can_start ?force clock with
692- | `True sync -> _start ?force ~sync clock
693+ | `True sync -> _start ?force ~sync ~c clock
693694 | `False -> ()
694695
695696let add_pending_clock =
@@ -700,7 +701,7 @@ let add_pending_clock =
700701 let clock = Unifier. deref c in
701702 match _can_start clock with
702703 | `True sync when sync <> `Passive ->
703- _start ~sync clock;
704+ _start ~sync ~c clock;
704705 Queue. push clocks c
705706 | _ -> ()
706707 in
@@ -747,7 +748,7 @@ let start_pending () =
747748 match _can_start clock with
748749 | `True `Passive -> ()
749750 | `True sync ->
750- _start ~sync clock;
751+ _start ~sync ~c clock;
751752 Queue. push clocks c
752753 | `False -> WeakQueue. push pending_clocks c)
753754 | _ -> () )
0 commit comments