@@ -4,6 +4,8 @@ import 'package:meta/meta.dart';
44import 'package:simdart/src/event.dart' ;
55import 'package:simdart/src/event_phase.dart' ;
66import 'package:simdart/src/internal/completer_action.dart' ;
7+ import 'package:simdart/src/internal/completer_interrupt.dart' ;
8+ import 'package:simdart/src/internal/stop_action.dart' ;
79import 'package:simdart/src/internal/time_action.dart' ;
810import 'package:simdart/src/interval.dart' ;
911import 'package:simdart/src/resources.dart' ;
@@ -52,46 +54,49 @@ class EventAction extends TimeAction implements SimContext {
5254 throw StateError ('This event is yielding' );
5355 }
5456
55- sim.observer ? .onEvent (
57+ sim.listener ? .onEvent (
5658 name: eventName,
5759 time: sim.now,
5860 phase: EventPhase .called,
5961 executionHash: hashCode);
6062
61- _runEvent ().then ((_) {
62- if (_eventCompleter != null ) {
63+ event (this ).then ((_) {
64+ if (_eventCompleter != null && sim.runState == RunState .running) {
65+ SimDartHelper .removeCompleter (
66+ sim: sim, completer: _eventCompleter! .completer);
6367 SimDartHelper .error (
6468 sim: sim,
65- msg :
66- "Next event is being scheduled, but the current one is still paused waiting for continuation. Did you forget to use 'await'?" );
69+ error : StateError (
70+ "Next event is being scheduled, but the current one is still paused waiting for continuation. Did you forget to use 'await'?" )) ;
6771 return ;
6872 }
69- sim.observer ? .onEvent (
73+ sim.listener ? .onEvent (
7074 name: eventName,
7175 time: sim.now,
7276 phase: EventPhase .finished,
7377 executionHash: hashCode);
74-
7578 SimDartHelper .scheduleNextAction (sim: sim);
76- }).catchError ((e) {
77- // Sim already marked to finish. Let the last event finalize.
79+ }).catchError ((error) {
80+ if (error is ! CompleterInterrupt ) {
81+ SimDartHelper .error (sim: sim, error: error);
82+ SimDartHelper .scheduleNextAction (sim: sim);
83+ }
7884 });
7985 }
8086
81- Future <void > _runEvent () async {
82- await event (this );
83- }
84-
8587 @override
8688 Future <void > wait (int delay) async {
8789 if (_eventCompleter != null ) {
90+ SimDartHelper .removeCompleter (
91+ sim: sim, completer: _eventCompleter! .completer);
8892 SimDartHelper .error (
8993 sim: sim,
90- msg: "The event is already waiting. Did you forget to use 'await'?" );
94+ error: StateError (
95+ "The event is already waiting. Did you forget to use 'await'?" ));
9196 return ;
9297 }
9398
94- sim.observer ? .onEvent (
99+ sim.listener ? .onEvent (
95100 name: eventName,
96101 time: sim.now,
97102 phase: EventPhase .yielded,
@@ -106,8 +111,8 @@ class EventAction extends TimeAction implements SimContext {
106111 start: sim.now + delay,
107112 complete: _eventCompleter! .complete,
108113 order: order));
109- SimDartHelper .scheduleNextAction (sim: sim);
110114
115+ SimDartHelper .scheduleNextAction (sim: sim);
111116 await _eventCompleter! .future;
112117 }
113118
@@ -133,6 +138,12 @@ class EventAction extends TimeAction implements SimContext {
133138 name: name);
134139 }
135140
141+ @override
142+ void stop () {
143+ SimDartHelper .addAction (
144+ sim: sim, action: StopAction (start: sim.now, sim: sim));
145+ }
146+
136147 @override
137148 SimCounter counter (String name) {
138149 return sim.counter (name);
@@ -142,29 +153,29 @@ class EventAction extends TimeAction implements SimContext {
142153 SimNum num (String name) {
143154 return sim.num (name);
144155 }
145-
146- @override
147- void dispose () {
148- _eventCompleter? .complete ();
149- }
150156}
151157
152158class EventCompleter {
153- EventCompleter ({required this .event});
159+ EventCompleter ({required this .event}) {
160+ SimDartHelper .addCompleter (sim: event.sim, completer: completer);
161+ }
154162
155- final Completer <void > _completer = Completer ();
163+ final Completer <void > completer = Completer ();
156164
157165 final EventAction event;
158166
159- Future <void > get future => _completer.future;
167+ Future <void > get future {
168+ return completer.future;
169+ }
160170
161171 void complete () {
162- event.sim.observer ? .onEvent (
172+ event.sim.listener ? .onEvent (
163173 name: event.eventName,
164174 time: event.sim.now,
165175 phase: EventPhase .resumed,
166176 executionHash: hashCode);
167- _completer .complete ();
177+ completer .complete ();
168178 event._eventCompleter = null ;
179+ SimDartHelper .removeCompleter (sim: event.sim, completer: completer);
169180 }
170181}
0 commit comments