@@ -15,6 +15,7 @@ pub struct ClockCoordinator {
1515 tx : mpsc:: UnboundedSender < ClockEvent > ,
1616 rx : mpsc:: UnboundedReceiver < ClockEvent > ,
1717 waiter_count : Arc < AtomicUsize > ,
18+ tasks : Arc < AtomicUsize > ,
1819}
1920
2021impl Default for ClockCoordinator {
@@ -28,18 +29,21 @@ impl ClockCoordinator {
2829 let time = Arc :: new ( AtomicTimestamp :: new ( Timestamp :: zero ( ) ) ) ;
2930 let ( tx, rx) = mpsc:: unbounded_channel ( ) ;
3031 let waiter_count = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
32+ let tasks = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
3133 Self {
3234 time,
3335 tx,
3436 rx,
3537 waiter_count,
38+ tasks,
3639 }
3740 }
3841
3942 pub fn clock ( & self ) -> Clock {
4043 Clock :: new (
4144 self . time . clone ( ) ,
4245 self . waiter_count . clone ( ) ,
46+ self . tasks . clone ( ) ,
4347 self . tx . clone ( ) ,
4448 )
4549 }
@@ -52,18 +56,18 @@ impl ClockCoordinator {
5256
5357 let mut queue: BTreeMap < Timestamp , Vec < usize > > = BTreeMap :: new ( ) ;
5458 let mut running = waiters. len ( ) ;
55- let mut open_tasks = 0 ;
5659 while let Some ( event) = self . rx . recv ( ) . await {
5760 match event {
5861 ClockEvent :: Wait { actor, until, done } => {
62+ assert ! ( until. is_none_or( |t| t > self . time. load( Ordering :: Acquire ) ) ) ;
5963 if waiters[ actor] . replace ( Waiter { until, done } ) . is_some ( ) {
6064 panic ! ( "An actor has somehow managed to wait twice" ) ;
6165 }
6266 running -= 1 ;
6367 if let Some ( timestamp) = until {
6468 queue. entry ( timestamp) . or_default ( ) . push ( actor) ;
6569 }
66- while running == 0 && open_tasks == 0 {
70+ while running == 0 && self . tasks . load ( Ordering :: Acquire ) == 0 {
6771 // advance time
6872 let ( timestamp, waiter_ids) = queue. pop_first ( ) . unwrap ( ) ;
6973 self . time . store ( timestamp, Ordering :: Release ) ;
@@ -86,11 +90,12 @@ impl ClockCoordinator {
8690 running += 1 ;
8791 }
8892 }
89- ClockEvent :: StartTask => {
90- open_tasks += 1 ;
91- }
9293 ClockEvent :: FinishTask => {
93- open_tasks -= 1 ;
94+ self . tasks . fetch_sub ( 1 , Ordering :: AcqRel ) ;
95+ assert ! (
96+ running != 0 ,
97+ "All tasks were completed while there were no actors to complete them"
98+ ) ;
9499 }
95100 }
96101 }
@@ -112,7 +117,6 @@ pub enum ClockEvent {
112117 CancelWait {
113118 actor : usize ,
114119 } ,
115- StartTask ,
116120 FinishTask ,
117121}
118122
0 commit comments