csimplemodule.h Source File¶

API: csimplemodule.h Source File
API
csimplemodule.h
1//==========================================================================
2// CSIMPLEMODULE.H - header for
3// OMNeT++/OMNEST
4// Discrete System Simulation in C++
5//
6//==========================================================================
7
8/*--------------------------------------------------------------*
9 Copyright (C) 1992-2017 Andras Varga
10 Copyright (C) 2006-2017 OpenSim Ltd.
11
12 This file is distributed WITHOUT ANY WARRANTY. See the file
13 `license' for details on this and other legal matters.
14*--------------------------------------------------------------*/
15
16#ifndef __OMNETPP_CSIMPLEMODULE_H
17#define __OMNETPP_CSIMPLEMODULE_H
18
19#include "cmodule.h"
20
21namespace omnetpp {
22
23class cQueue;
24class cCoroutine;
25
82struct SIM_API SendOptions {
83 simtime_t sendDelay = SIMTIME_ZERO; // for after()
84 simtime_t propagationDelay_ = SIMTIME_ZERO; // for sendDirect()
85 simtime_t duration_ = DURATION_UNSPEC; // for packets not using channel datarate
86 bool isUpdate = false;
87 txid_t transmissionId_ = -1; // if not -1, specifies the transmission id
88 simtime_t remainingDuration = DURATION_UNSPEC; // when updating an earlier transmission
89
90 static const simtime_t DURATION_UNSPEC;
91 static const SendOptions DEFAULT;
92
97
108 SendOptions& after(simtime_t delay) {this->sendDelay = delay; return *this;}
109
114 SendOptions& propagationDelay(simtime_t delay) {this->propagationDelay_ = delay; return *this;}
115
124 SendOptions& duration(simtime_t duration) {this->duration_ = duration; return *this;}
125
133 SendOptions& transmissionId(txid_t transmissionId) {this->transmissionId_ = transmissionId; return *this;}
134
142 SendOptions& finishTx(txid_t transmissionId) {this->isUpdate = true; this->transmissionId_ = transmissionId; remainingDuration = SIMTIME_ZERO; return *this;}
143
151 SendOptions& updateTx(txid_t transmissionId) {this->isUpdate = true; this->transmissionId_ = transmissionId; remainingDuration = DURATION_UNSPEC; return *this;}
152
158 SendOptions& updateTx(txid_t transmissionId, simtime_t remainingDuration) {this->isUpdate = true; this->transmissionId_ = transmissionId; this->remainingDuration = remainingDuration; return *this;}
159
163 std::string str() const;
164};
165
202class SIM_API cSimpleModule : public cModule //implies noncopyable
203{
204 friend class cModule;
205 friend class cSimulation;
206 friend class cMessage;
207
208 private:
209 enum {
210 FL_USESACTIVITY = 1 << 13, // uses activity() or handleMessage()
211 FL_ISTERMINATED = 1 << 14, // for both activity and handleMessage modules
212 FL_STACKALREADYUNWOUND = 1 << 15, // only for activity modules
213 FL_SUPPORTSTXUPDATES = 1 << 16, // whether module is prepared to receive tx updates (see SendOptions)
214 };
215
216 cMessage *timeoutMessage; // msg used in wait() and receive() with timeout
217 cCoroutine *coroutine;
218
219 static cMessage *msgForActivity; // helper variable to pass the received message into activity()
220 static bool stackCleanupRequested; // 'true' value asks activity() to throw a cStackCleanupException
221 static cSimpleModule *afterCleanupTransferTo; // transfer back to this module (or to main)
222
223 private:
224 // internal use
225 static void activate(void *p);
226
227 // internal utility methods
228 cGate *resolveSendDirectGate(cModule *mod, int gateId);
229 cGate *resolveSendDirectGate(cModule *mod, const char *gateName, int gateIndex);
230 static SendOptions resolveSendDirectOptions(simtime_t propagationDelay, simtime_t duration);
231 void deleteObsoletedTransmissionFromFES(txid_t transmissionId, cPacket *updatePkt);
232 void throwNotOwnerOfMessage(const char *sendOp, cMessage *msg);
233
234 protected:
235 // internal: handle a message event, basically dispatch to handleMessage() or activity(); not supposed to be overridden by models
236 virtual void doMessageEvent(cMessage *msg);
237
238 protected:
249
255 virtual void activity();
256
261 virtual void handleMessage(cMessage *msg);
263
264 public:
267
273 cSimpleModule(unsigned stacksize = 0);
274
279 virtual ~cSimpleModule();
281
284
288 virtual std::string str() const override;
289
293 virtual bool isSimple() const override;
294
299 virtual void forEachChild(cVisitor *v) override;
301
304
308 virtual void scheduleStart(simtime_t t) override;
309
315 virtual void arrived(cMessage *msg, cGate *ongate, const SendOptions& options, simtime_t t) override;
317
320
324 bool usesActivity() const {return flags&FL_USESACTIVITY;}
325
341 void setTxUpdateSupport(bool b) {setFlag(FL_SUPPORTSTXUPDATES, b);}
342
348 bool supportsTxUpdates() const {return flags&FL_SUPPORTSTXUPDATES;}
349
354 bool isTerminated() const {return flags&FL_ISTERMINATED;}
356
359
375 virtual void snapshot(cObject *obj=nullptr, const char *label=nullptr);
377
380
384 virtual void send(cMessage *msg, int gateid) {send(msg, gate(gateid));}
385
390 virtual void send(cMessage *msg, const char *gatename, int gateindex=-1) {send(msg, gate(gatename, gateindex));}
391
395 virtual void send(cMessage *msg, cGate *outputgate) {send(msg, SendOptions::DEFAULT, outputgate);}
396
400 virtual void send(cMessage *msg, const SendOptions& options, int gateid) {send(msg, options, gate(gateid));}
401
406 virtual void send(cMessage *msg, const SendOptions& options, const char *gatename, int gateindex=-1) {send(msg, options, gate(gatename, gateindex));}
407
411 virtual void send(cMessage *msg, const SendOptions& options, cGate *outputgate);
412
416 virtual void sendDelayed(cMessage *msg, simtime_t delay, int gateid) {send(msg, SendOptions().after(delay), gate(gateid));}
417
421 virtual void sendDelayed(cMessage *msg, simtime_t delay, const char *gatename, int gateindex=-1) {send(msg, SendOptions().after(delay), gate(gatename, gateindex));}
422
426 virtual void sendDelayed(cMessage *msg, simtime_t delay, cGate *outputgate) {send(msg, SendOptions().after(delay), outputgate);}
427
433 virtual void sendDirect(cMessage *msg, cModule *mod, const char *inputGateName, int gateIndex=-1) {sendDirect(msg, SendOptions::DEFAULT, resolveSendDirectGate(mod, inputGateName, gateIndex));}
434
440 virtual void sendDirect(cMessage *msg, cModule *mod, int inputGateId) {sendDirect(msg, SendOptions::DEFAULT, resolveSendDirectGate(mod, inputGateId));}
441
447 virtual void sendDirect(cMessage *msg, cGate *inputGate) {sendDirect(msg, SendOptions::DEFAULT, inputGate);}
448
454 virtual void sendDirect(cMessage *msg, const SendOptions& options, cModule *mod, const char *inputGateName, int gateIndex=-1) {sendDirect(msg, options, resolveSendDirectGate(mod, inputGateName, gateIndex));}
455
461 virtual void sendDirect(cMessage *msg, const SendOptions& options, cModule *mod, int inputGateId) {sendDirect(msg, options, resolveSendDirectGate(mod, inputGateId));}
462
485 virtual void sendDirect(cMessage *msg, const SendOptions& options, cGate *inputGate);
486
490 virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, const char *inputGateName, int gateIndex=-1) {sendDirect(msg, resolveSendDirectOptions(propagationDelay, duration), resolveSendDirectGate(mod, inputGateName, gateIndex));}
491
495 virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, int inputGateId) {sendDirect(msg, resolveSendDirectOptions(propagationDelay, duration), resolveSendDirectGate(mod, inputGateId));}
496
500 virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cGate *inputGate) {sendDirect(msg, resolveSendDirectOptions(propagationDelay, duration), inputGate);}
502
505
534 virtual void scheduleAt(simtime_t t, cMessage *msg);
535
543 virtual void scheduleAfter(simtime_t delay, cMessage *msg);
544
552 virtual void rescheduleAt(simtime_t t, cMessage *msg);
553
561 virtual void rescheduleAfter(simtime_t delay, cMessage *msg);
562
569 virtual cMessage *cancelEvent(cMessage *msg);
570
577 virtual void cancelAndDelete(cMessage *msg);
579
585
590 virtual cMessage *receive();
591
599 virtual cMessage *receive(simtime_t timeout);
601
604
618 virtual void wait(simtime_t time);
619
627 virtual void waitAndEnqueue(simtime_t time, cQueue *queue);
629
632
636 virtual void endSimulation();
637
643 virtual void halt();
644
648 _OPP_GNU_ATTRIBUTE(format(printf, 2, 3))
649 virtual void error(const char *format,...) const;
651
654
663 virtual bool hasStackOverflow() const;
664
669 virtual unsigned getStackSize() const;
670
679 virtual unsigned getStackUsage() const;
681};
682
683} // namespace omnetpp
684
685
686#endif
687
Low-level coroutine library. Coroutines are used by cSimpleModule.
Definition ccoroutine.h:67
virtual cGate * gate(const char *gatename, int index=-1)
cObject is a lightweight class which serves as the root of the OMNeT++ class hierarchy....
Definition cobject.h:93
A subclass of cMessage to represent packets, frames, datagrams, application messages,...
Definition cpacket.h:53
Queue class for objects derived from cObject.
Definition cqueue.h:43
virtual void scheduleStart(simtime_t t) override
virtual void rescheduleAfter(simtime_t delay, cMessage *msg)
virtual void send(cMessage *msg, const SendOptions &options, cGate *outputgate)
virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, const char *inputGateName, int gateIndex=-1)
Definition csimplemodule.h:490
virtual unsigned getStackSize() const
virtual void rescheduleAt(simtime_t t, cMessage *msg)
virtual void sendDirect(cMessage *msg, const SendOptions &options, cGate *inputGate)
virtual void sendDelayed(cMessage *msg, simtime_t delay, cGate *outputgate)
Definition csimplemodule.h:426
virtual void send(cMessage *msg, cGate *outputgate)
Definition csimplemodule.h:395
virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cGate *inputGate)
Definition csimplemodule.h:500
virtual void wait(simtime_t time)
virtual void sendDirect(cMessage *msg, simtime_t propagationDelay, simtime_t duration, cModule *mod, int inputGateId)
Definition csimplemodule.h:495
virtual cMessage * receive()
virtual void activity()
virtual void endSimulation()
virtual void send(cMessage *msg, int gateid)
Definition csimplemodule.h:384
virtual void snapshot(cObject *obj=nullptr, const char *label=nullptr)
virtual void scheduleAfter(simtime_t delay, cMessage *msg)
virtual void sendDirect(cMessage *msg, const SendOptions &options, cModule *mod, const char *inputGateName, int gateIndex=-1)
Definition csimplemodule.h:454
virtual void handleMessage(cMessage *msg)
virtual void halt()
void setTxUpdateSupport(bool b)
Definition csimplemodule.h:341
virtual void send(cMessage *msg, const char *gatename, int gateindex=-1)
Definition csimplemodule.h:390
virtual void cancelAndDelete(cMessage *msg)
virtual void sendDirect(cMessage *msg, cModule *mod, int inputGateId)
Definition csimplemodule.h:440
virtual cMessage * cancelEvent(cMessage *msg)
virtual void send(cMessage *msg, const SendOptions &options, int gateid)
Definition csimplemodule.h:400
cSimpleModule(unsigned stacksize=0)
bool isTerminated() const
Definition csimplemodule.h:354
bool supportsTxUpdates() const
Definition csimplemodule.h:348
virtual void scheduleAt(simtime_t t, cMessage *msg)
virtual void sendDirect(cMessage *msg, cGate *inputGate)
Definition csimplemodule.h:447
virtual void send(cMessage *msg, const SendOptions &options, const char *gatename, int gateindex=-1)
Definition csimplemodule.h:406
virtual void sendDirect(cMessage *msg, cModule *mod, const char *inputGateName, int gateIndex=-1)
Definition csimplemodule.h:433
virtual unsigned getStackUsage() const
bool usesActivity() const
Definition csimplemodule.h:324
virtual cMessage * receive(simtime_t timeout)
virtual void sendDelayed(cMessage *msg, simtime_t delay, int gateid)
Definition csimplemodule.h:416
virtual void waitAndEnqueue(simtime_t time, cQueue *queue)
virtual void sendDelayed(cMessage *msg, simtime_t delay, const char *gatename, int gateindex=-1)
Definition csimplemodule.h:421
virtual bool isSimple() const override
virtual void forEachChild(cVisitor *v) override
virtual std::string str() const override
virtual void arrived(cMessage *msg, cGate *ongate, const SendOptions &options, simtime_t t) override
virtual void sendDirect(cMessage *msg, const SendOptions &options, cModule *mod, int inputGateId)
Definition csimplemodule.h:461
virtual void error(const char *format,...) const
virtual bool hasStackOverflow() const
Enables traversing the tree of (cObject-rooted) simulation objects.
Definition cvisitor.h:57
int64_t txid_t
Transmission ID. See SendOptions::transmissionId(), cMessage::getTransmissionId().
Definition simkerneldefs.h:92
SimTime simtime_t
Represents simulation time.
Definition simtime_t.h:40
#define SIMTIME_ZERO
Zero simulation time.
Definition simtime_t.h:70
Options for the cSimpleModule::send() and cSimpleModule::sendDirect() calls.
Definition csimplemodule.h:82
SendOptions & updateTx(txid_t transmissionId)
Definition csimplemodule.h:151
SendOptions & propagationDelay(simtime_t delay)
Definition csimplemodule.h:114
SendOptions()
Definition csimplemodule.h:96
SendOptions & updateTx(txid_t transmissionId, simtime_t remainingDuration)
Definition csimplemodule.h:158
SendOptions & transmissionId(txid_t transmissionId)
Definition csimplemodule.h:133
SendOptions & duration(simtime_t duration)
Definition csimplemodule.h:124
SendOptions & after(simtime_t delay)
Definition csimplemodule.h:108
std::string str() const
SendOptions & finishTx(txid_t transmissionId)
Definition csimplemodule.h:142