Skip to content

Commit 126647e

Browse files
authored
Version 0.4.0 (#19)
* Trying to close pending Completers. #18 * Trying to close pending Completers. #18 * Trying to close pending Completers. #18 * Removing nextAction debug track. #18 * Adding error handling. #18 * Removing unused import.
1 parent 194c726 commit 126647e

23 files changed

+458
-179
lines changed

CHANGELOG.md

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

39
* Access the list of created resources.
410
* Added
511
* `runState` getter to determine whether the simulation has not started, is running, or has completed.
612
* `stop` method to manually stop the simulation before it completes.
7-
* Observer to receive data throughout the simulation.
13+
* Listener to receive data throughout the simulation.
814

915
## 0.2.0
1016

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/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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import 'package:meta/meta.dart';
2+
3+
@internal
4+
class CompleterInterrupt {}

lib/src/internal/debug_listener.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import 'package:meta/meta.dart';
2+
3+
@internal
4+
abstract class DebugListener {
5+
void onAddCompleter();
6+
7+
void onRemoveCompleter();
8+
}

lib/src/internal/event_action.dart

Lines changed: 37 additions & 26 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';
@@ -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

152158
class 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
}

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: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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+
StopAction({required super.start, super.order = -1, required this.sim});
8+
9+
final SimDart sim;
10+
11+
@override
12+
void execute() {
13+
SimDartHelper.stop(sim: sim);
14+
SimDartHelper.scheduleNextAction(sim: sim);
15+
}
16+
}

lib/src/internal/time_action.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,4 @@ abstract class TimeAction {
1414
final int order;
1515

1616
void execute();
17-
18-
void dispose();
1917
}

0 commit comments

Comments
 (0)