Skip to content

Commit ec86a32

Browse files
committed
ActivePacketSource: Extended to allow for infinite packet interval parameter value, which stops packet production.
1 parent a83f188 commit ec86a32

2 files changed

Lines changed: 15 additions & 12 deletions

File tree

src/inet/queueing/source/ActivePacketSource.cc

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,15 @@ void ActivePacketSource::initialize(int stage)
2323
}
2424
else if (stage == INITSTAGE_QUEUEING) {
2525
checkPacketOperationSupport(outputGate);
26-
if (!productionTimer->isScheduled())
26+
if (productionTimer != nullptr && !productionTimer->isScheduled())
2727
scheduleProductionTimerAndProducePacket();
2828
}
2929
}
3030

3131
void ActivePacketSource::handleMessage(cMessage *message)
3232
{
33-
if (message == productionTimer) {
34-
if (consumer == nullptr || consumer.canPushSomePacket()) {
35-
scheduleProductionTimer(productionIntervalParameter->doubleValue());
36-
producePacket();
37-
}
38-
}
33+
if (message == productionTimer)
34+
scheduleProductionTimerAndProducePacket();
3935
else
4036
throw cRuntimeError("Unknown message");
4137
}
@@ -56,12 +52,19 @@ void ActivePacketSource::scheduleProductionTimer(clocktime_t delay)
5652

5753
void ActivePacketSource::scheduleProductionTimerAndProducePacket()
5854
{
59-
if (!initialProductionOffsetScheduled && initialProductionOffset >= CLOCKTIME_ZERO) {
60-
scheduleProductionTimer(initialProductionOffset);
55+
if (!initialProductionOffsetScheduled && initialProductionOffset >= 0) {
56+
if (std::isfinite(initialProductionOffset))
57+
scheduleProductionTimer(initialProductionOffset);
6158
initialProductionOffsetScheduled = true;
6259
}
6360
else if (consumer == nullptr || consumer.canPushSomePacket()) {
64-
scheduleProductionTimer(productionIntervalParameter->doubleValue());
61+
double interval = productionIntervalParameter->doubleValue();
62+
if (std::isfinite(interval))
63+
scheduleProductionTimer(interval);
64+
else {
65+
cancelAndDelete(productionTimer);
66+
productionTimer = nullptr;
67+
}
6568
producePacket();
6669
}
6770
}
@@ -77,7 +80,7 @@ void ActivePacketSource::producePacket()
7780
void ActivePacketSource::handleCanPushPacketChanged(const cGate *gate)
7881
{
7982
Enter_Method("handleCanPushPacketChanged");
80-
if (!productionTimer->isScheduled())
83+
if (productionTimer != nullptr && !productionTimer->isScheduled())
8184
scheduleProductionTimerAndProducePacket();
8285
}
8386

src/inet/queueing/source/ActivePacketSource.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class INET_API ActivePacketSource : public ClockUserModuleMixin<ActivePacketSour
2121
{
2222
protected:
2323
bool initialProductionOffsetScheduled = false;
24-
clocktime_t initialProductionOffset;
24+
double initialProductionOffset = NaN;
2525
cPar *productionIntervalParameter = nullptr;
2626
ClockEvent *productionTimer = nullptr;
2727
bool scheduleForAbsoluteTime = false;

0 commit comments

Comments
 (0)