@@ -2,17 +2,15 @@ import 'dart:async';
2
2
3
3
import 'package:meta/meta.dart' ;
4
4
import 'package:simdart/src/event.dart' ;
5
+ import 'package:simdart/src/event_phase.dart' ;
5
6
import 'package:simdart/src/internal/completer_action.dart' ;
6
- import 'package:simdart/src/internal/resource.dart' ;
7
- import 'package:simdart/src/internal/resources_context_impl.dart' ;
8
7
import 'package:simdart/src/internal/time_action.dart' ;
9
8
import 'package:simdart/src/interval.dart' ;
10
- import 'package:simdart/src/resources_context .dart' ;
9
+ import 'package:simdart/src/resources .dart' ;
11
10
import 'package:simdart/src/sim_context.dart' ;
12
11
import 'package:simdart/src/sim_counter.dart' ;
13
12
import 'package:simdart/src/sim_num.dart' ;
14
13
import 'package:simdart/src/simdart.dart' ;
15
- import 'package:simdart/src/simulation_track.dart' ;
16
14
17
15
@internal
18
16
class EventAction extends TimeAction implements SimContext {
@@ -35,24 +33,30 @@ class EventAction extends TimeAction implements SimContext {
35
33
final SimDart sim;
36
34
37
35
@override
38
- late final ResourcesContext resources = ResourcesContextImpl (sim, this );
36
+ late final ResourcesContext resources = ResourcesFactory . context (sim, this );
39
37
40
38
@override
41
39
int get now => sim.now;
42
40
43
41
/// Internal handler for resuming a waiting event.
44
42
EventCompleter ? _eventCompleter;
43
+ EventCompleter ? get eventCompleter => _eventCompleter;
44
+
45
+ void buildCompleter () {
46
+ _eventCompleter = EventCompleter (event: this );
47
+ }
45
48
46
49
@override
47
50
void execute () {
48
51
if (_eventCompleter != null ) {
49
52
throw StateError ('This event is yielding' );
50
53
}
51
54
52
- if (sim.includeTracks) {
53
- SimDartHelper .addSimulationTrack (
54
- sim: sim, eventName: eventName, status: Status .called);
55
- }
55
+ sim.observer? .onEvent (
56
+ name: eventName,
57
+ time: sim.now,
58
+ phase: EventPhase .called,
59
+ executionHash: hashCode);
56
60
57
61
_runEvent ().then ((_) {
58
62
if (_eventCompleter != null ) {
@@ -62,7 +66,15 @@ class EventAction extends TimeAction implements SimContext {
62
66
"Next event is being scheduled, but the current one is still paused waiting for continuation. Did you forget to use 'await'?" );
63
67
return ;
64
68
}
69
+ sim.observer? .onEvent (
70
+ name: eventName,
71
+ time: sim.now,
72
+ phase: EventPhase .finished,
73
+ executionHash: hashCode);
74
+
65
75
SimDartHelper .scheduleNextAction (sim: sim);
76
+ }).catchError ((e) {
77
+ // Sim already marked to finish. Let the last event finalize.
66
78
});
67
79
}
68
80
@@ -79,10 +91,12 @@ class EventAction extends TimeAction implements SimContext {
79
91
return ;
80
92
}
81
93
82
- if (sim.includeTracks) {
83
- SimDartHelper .addSimulationTrack (
84
- sim: sim, eventName: eventName, status: Status .yielded);
85
- }
94
+ sim.observer? .onEvent (
95
+ name: eventName,
96
+ time: sim.now,
97
+ phase: EventPhase .yielded,
98
+ executionHash: hashCode);
99
+
86
100
_eventCompleter = EventCompleter (event: this );
87
101
88
102
// Schedule a complete to resume this event in the future.
@@ -95,53 +109,6 @@ class EventAction extends TimeAction implements SimContext {
95
109
SimDartHelper .scheduleNextAction (sim: sim);
96
110
97
111
await _eventCompleter! .future;
98
- _eventCompleter = null ;
99
- }
100
-
101
- Future <void > acquireResource (String id) async {
102
- if (_eventCompleter != null ) {
103
- SimDartHelper .error (
104
- sim: sim,
105
- msg:
106
- "This event should be waiting for the resource to be released. Did you forget to use 'await'?" );
107
- return ;
108
- }
109
- Resource ? resource = SimDartHelper .getResource (sim: sim, resourceId: id);
110
- if (resource != null ) {
111
- bool acquired = resource.acquire (this );
112
- if (! acquired) {
113
- if (sim.includeTracks) {
114
- SimDartHelper .addSimulationTrack (
115
- sim: sim, eventName: eventName, status: Status .yielded);
116
- }
117
- _eventCompleter = EventCompleter (event: this );
118
- resource.waiting.add (this );
119
- SimDartHelper .scheduleNextAction (sim: sim);
120
- await _eventCompleter! .future;
121
- _eventCompleter = null ;
122
- return await acquireResource (id);
123
- }
124
- }
125
- }
126
-
127
- void releaseResource (String id) {
128
- Resource ? resource = SimDartHelper .getResource (sim: sim, resourceId: id);
129
- if (resource != null ) {
130
- if (resource.release (sim, this )) {
131
- if (resource.waiting.isNotEmpty) {
132
- //resource.waiting.removeAt(0).call();
133
- EventAction other = resource.waiting.removeAt (0 );
134
- // Schedule a complete to resume this event in the future.
135
- SimDartHelper .addAction (
136
- sim: sim,
137
- action: CompleterAction (
138
- start: sim.now,
139
- complete: other._eventCompleter! .complete,
140
- order: other.order));
141
- SimDartHelper .scheduleNextAction (sim: sim);
142
- }
143
- }
144
- }
145
112
}
146
113
147
114
@override
@@ -175,6 +142,11 @@ class EventAction extends TimeAction implements SimContext {
175
142
SimNum num (String name) {
176
143
return sim.num (name);
177
144
}
145
+
146
+ @override
147
+ void dispose () {
148
+ _eventCompleter? .complete ();
149
+ }
178
150
}
179
151
180
152
class EventCompleter {
@@ -187,10 +159,11 @@ class EventCompleter {
187
159
Future <void > get future => _completer.future;
188
160
189
161
void complete () {
190
- if (event.sim.includeTracks) {
191
- SimDartHelper .addSimulationTrack (
192
- sim: event.sim, eventName: event.eventName, status: Status .resumed);
193
- }
162
+ event.sim.observer? .onEvent (
163
+ name: event.eventName,
164
+ time: event.sim.now,
165
+ phase: EventPhase .resumed,
166
+ executionHash: hashCode);
194
167
_completer.complete ();
195
168
event._eventCompleter = null ;
196
169
}
0 commit comments