Skip to content

Commit 612ff61

Browse files
committed
bugfix: RealTimeScheduler ignore stale events (#1018)
1 parent f750cde commit 612ff61

1 file changed

Lines changed: 41 additions & 31 deletions

File tree

src/inet/common/scheduler/RealTimeScheduler.cc

Lines changed: 41 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -154,40 +154,51 @@ cEvent *RealTimeScheduler::guessNextEvent()
154154

155155
cEvent *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

193204
void RealTimeScheduler::putBackEvent(cEvent *event)
@@ -196,4 +207,3 @@ void RealTimeScheduler::putBackEvent(cEvent *event)
196207
}
197208

198209
} // namespace inet
199-

0 commit comments

Comments
 (0)