Skip to content

Commit fe20d33

Browse files
committed
Trying to close pending Completers. #18
1 parent 194c726 commit fe20d33

22 files changed

+418
-148
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
## 0.4.0
2+
3+
* Added
4+
* `stop` method in `SimContext`.
5+
16
## 0.3.0
27

38
* Access the list of created resources.
49
* Added
510
* `runState` getter to determine whether the simulation has not started, is running, or has completed.
611
* `stop` method to manually stop the simulation before it completes.
7-
* Observer to receive data throughout the simulation.
12+
* Listener to receive data throughout the simulation.
813

914
## 0.2.0
1015

example/example.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
import 'dart:async';
2+
13
import 'package:simdart/simdart.dart';
24

35
void main() async {
4-
final SimDart sim = SimDart(observer: ConsoleEventObserver());
6+
final SimDart sim = SimDart(listener: ConsoleEventListener());
57

68
sim.process(event: _eventA, name: 'A');
79

lib/simdart.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export 'src/event.dart';
22
export 'src/interval.dart';
33
export 'src/observable.dart';
4-
export 'src/sim_observer.dart';
4+
export 'src/sim_listener.dart';
55
export 'src/event_phase.dart';
66
export 'src/resources.dart' hide ResourcesFactory, ResourceStore;
77
export 'src/simdart.dart' hide SimDartHelper;

lib/src/event_phase.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ enum EventPhase {
1111

1212
yielded,
1313

14+
interrupted,
15+
1416
finished;
1517

1618
/// Returns the string representation of the status.

lib/src/internal/completer_action.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,4 @@ class CompleterAction extends TimeAction {
1212
void execute() {
1313
complete.call();
1414
}
15-
16-
@override
17-
void dispose() {}
1815
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'package:meta/meta.dart';
2+
3+
@internal
4+
class CompleterInterrupt{
5+
6+
}

lib/src/internal/debug_listener.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:meta/meta.dart';
2+
3+
@internal
4+
abstract class DebugListener {
5+
6+
void onScheduleNextAction();
7+
8+
void onNextAction();
9+
10+
void onExecuteAction();
11+
12+
void onStop();
13+
14+
void onAddCompleter();
15+
16+
void onRemoveCompleter();
17+
}
18+

lib/src/internal/event_action.dart

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import 'package:meta/meta.dart';
44
import 'package:simdart/src/event.dart';
55
import 'package:simdart/src/event_phase.dart';
66
import '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';
79
import 'package:simdart/src/internal/time_action.dart';
810
import 'package:simdart/src/interval.dart';
911
import 'package:simdart/src/resources.dart';
@@ -48,50 +50,60 @@ class EventAction extends TimeAction implements SimContext {
4850

4951
@override
5052
void execute() {
53+
print('execute: $eventName');
5154
if (_eventCompleter != null) {
5255
throw StateError('This event is yielding');
5356
}
5457

55-
sim.observer?.onEvent(
58+
sim.listener?.onEvent(
5659
name: eventName,
5760
time: sim.now,
5861
phase: EventPhase.called,
5962
executionHash: hashCode);
6063

61-
_runEvent().then((_) {
62-
if (_eventCompleter != null) {
63-
SimDartHelper.error(
64-
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'?");
67-
return;
64+
event(this).then((_) {
65+
print('then $eventName ${sim.runState.name}');
66+
if (_eventCompleter != null && sim.runState==RunState.running) {
67+
//TODO method or throw?
68+
SimDartHelper.error(
69+
sim: sim,
70+
error:
71+
StateError(
72+
"Next event is being scheduled, but the current one is still paused waiting for continuation. Did you forget to use 'await'?"));
73+
return;
74+
}
75+
sim.listener?.onEvent(
76+
name: eventName,
77+
time: sim.now,
78+
phase: EventPhase.finished,
79+
executionHash: hashCode);
80+
SimDartHelper.scheduleNextAction(sim: sim);
81+
}).catchError((error) {
82+
//TODO rever
83+
if(error is CompleterInterrupt) {
84+
sim.listener?.onEvent(
85+
name: eventName,
86+
time: sim.now,
87+
phase: EventPhase.interrupted,
88+
executionHash: hashCode);
89+
} else {
90+
print('ZZ');
91+
SimDartHelper.error(sim: sim, error: error);
6892
}
69-
sim.observer?.onEvent(
70-
name: eventName,
71-
time: sim.now,
72-
phase: EventPhase.finished,
73-
executionHash: hashCode);
74-
75-
SimDartHelper.scheduleNextAction(sim: sim);
76-
}).catchError((e) {
77-
// Sim already marked to finish. Let the last event finalize.
7893
});
7994
}
8095

81-
Future<void> _runEvent() async {
82-
await event(this);
83-
}
84-
8596
@override
8697
Future<void> wait(int delay) async {
8798
if (_eventCompleter != null) {
99+
//TODO method or throw?
88100
SimDartHelper.error(
89101
sim: sim,
90-
msg: "The event is already waiting. Did you forget to use 'await'?");
102+
error: StateError("The event is already waiting. Did you forget to use 'await'?"));
91103
return;
92104
}
93105

94-
sim.observer?.onEvent(
106+
sim.listener?.onEvent(
95107
name: eventName,
96108
time: sim.now,
97109
phase: EventPhase.yielded,
@@ -106,9 +118,9 @@ class EventAction extends TimeAction implements SimContext {
106118
start: sim.now + delay,
107119
complete: _eventCompleter!.complete,
108120
order: order));
109-
SimDartHelper.scheduleNextAction(sim: sim);
110121

111-
await _eventCompleter!.future;
122+
SimDartHelper.scheduleNextAction(sim: sim);
123+
await _eventCompleter!.future;
112124
}
113125

114126
@override
@@ -133,6 +145,11 @@ class EventAction extends TimeAction implements SimContext {
133145
name: name);
134146
}
135147

148+
@override
149+
void stop(){
150+
SimDartHelper.addAction(sim: sim, action: StopAction(start: sim.now, sim:sim));
151+
}
152+
136153
@override
137154
SimCounter counter(String name) {
138155
return sim.counter(name);
@@ -142,15 +159,12 @@ class EventAction extends TimeAction implements SimContext {
142159
SimNum num(String name) {
143160
return sim.num(name);
144161
}
145-
146-
@override
147-
void dispose() {
148-
_eventCompleter?.complete();
149-
}
150162
}
151163

152164
class EventCompleter {
153-
EventCompleter({required this.event});
165+
EventCompleter({required this.event}){
166+
SimDartHelper.addCompleter(sim: event.sim, completer: _completer);
167+
}
154168

155169
final Completer<void> _completer = Completer();
156170

@@ -159,12 +173,13 @@ class EventCompleter {
159173
Future<void> get future => _completer.future;
160174

161175
void complete() {
162-
event.sim.observer?.onEvent(
176+
event.sim.listener?.onEvent(
163177
name: event.eventName,
164178
time: event.sim.now,
165179
phase: EventPhase.resumed,
166180
executionHash: hashCode);
167181
_completer.complete();
168182
event._eventCompleter = null;
183+
SimDartHelper.removeCompleter(sim: event.sim, completer: _completer);
169184
}
170185
}

lib/src/internal/repeat_event_action.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,4 @@ class RepeatEventAction extends TimeAction {
4545
}
4646
SimDartHelper.scheduleNextAction(sim: sim);
4747
}
48-
49-
@override
50-
void dispose() {}
5148
}

lib/src/internal/stop_action.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:meta/meta.dart';
2+
import 'package:simdart/src/internal/time_action.dart';
3+
import 'package:simdart/src/simdart.dart';
4+
5+
@internal
6+
class StopAction extends TimeAction{
7+
8+
StopAction({required super.start, super.order=-1, required this.sim});
9+
10+
final SimDart sim;
11+
12+
@override
13+
void execute() {
14+
print('entrou no stopAction');
15+
SimDartHelper.stop(sim: sim);
16+
SimDartHelper.scheduleNextAction(sim: sim);
17+
}
18+
19+
}

0 commit comments

Comments
 (0)