@@ -154,40 +154,51 @@ cEvent *RealTimeScheduler::guessNextEvent()
154154
155155cEvent *RealTimeScheduler::takeNextEvent ()
156156{
157- int64_t targetTime;
158-
159- // calculate target time
160- cEvent *event = sim->getFES ()->peekFirst ();
161- if (!event)
162- // as far into the future as reasonable (hoping we will never overflow - it is unlikely)
163- targetTime = INT64_MAX ;
164- else {
165- // use time of next event
166- simtime_t eventSimtime = event->getArrivalTime ();
167- targetTime = baseTime + eventSimtime.inUnit (SIMTIME_NS );
168- }
157+ // Loop to handle stale events
158+ while (true ) {
159+ int64_t targetTime;
160+
161+ // calculate target time
162+ cEvent *event = sim->getFES ()->peekFirst ();
163+ if (!event)
164+ // as far into the future as reasonable (hoping we will never overflow - it is unlikely)
165+ targetTime = INT64_MAX ;
166+ else {
167+ // use time of next event
168+ simtime_t eventSimtime = event->getArrivalTime ();
169+ targetTime = baseTime + eventSimtime.inUnit (SIMTIME_NS );
170+ }
169171
170- // if needed, wait until that time arrives
171- int64_t curTime = opp_get_monotonic_clock_nsecs ();
172+ // if needed, wait until that time arrives
173+ int64_t curTime = opp_get_monotonic_clock_nsecs ();
172174
173- if (targetTime > curTime) {
174- switch (receiveUntil (targetTime)) {
175- case -1 : return nullptr ; // interrupted by user
176- case 0 : break ; // nothing to do
177- case 1 : event = sim->getFES ()->peekFirst (); break ; // received something
178- default : ASSERT (false ); break ;
175+ if (targetTime > curTime) {
176+ switch (receiveUntil (targetTime)) {
177+ case -1 : return nullptr ; // interrupted by user
178+ case 0 : break ; // nothing to do
179+ case 1 : event = sim->getFES ()->peekFirst (); break ; // received something
180+ default : ASSERT (false ); break ;
181+ }
179182 }
183+ else {
184+ // we're behind -- customized versions of this class may
185+ // alert if we're too much behind, whatever that means
186+ // NOTE: this is commented out because it generates too much noise by default
187+ // int64_t diffTime = curTime - targetTime;
188+ // EV_TRACE << "We are behind: " << diffTime * 1e-9 << " seconds\n";
189+ }
190+
191+ cEvent *tmp = sim->getFES ()->removeFirst ();
192+ ASSERT (tmp == event);
193+
194+ // Check if event is stale
195+ if (tmp->isStale ()) {
196+ delete tmp;
197+ continue ; // try next event
198+ }
199+
200+ return event;
180201 }
181- else {
182- // we're behind -- customized versions of this class may
183- // alert if we're too much behind, whatever that means
184- // NOTE: this is commented out because it generates too much noise by default
185- // int64_t diffTime = curTime - targetTime;
186- // EV_TRACE << "We are behind: " << diffTime * 1e-9 << " seconds\n";
187- }
188- cEvent *tmp = sim->getFES ()->removeFirst ();
189- ASSERT (tmp == event);
190- return event;
191202}
192203
193204void RealTimeScheduler::putBackEvent (cEvent *event)
@@ -196,4 +207,3 @@ void RealTimeScheduler::putBackEvent(cEvent *event)
196207}
197208
198209} // namespace inet
199-
0 commit comments