%description: Tests a handleMessage() simple module deleting an activity() simple module which (a) stays inside a wait() call (b) stays inside a receive() call and has scheduled events. %file: test.ned simple NodeA { } simple NodeB { } simple Deleter { } network Test { submodules: nodeA: NodeA; nodeB: NodeB; deleter: Deleter; } %file: test.cc #include using namespace omnetpp; namespace @TESTNAME@ { class NodeA : public cSimpleModule { public: NodeA() : cSimpleModule(16384) { } virtual void activity() override; }; Define_Module(NodeA); void NodeA::activity() { for (int i=0; i<10; i++) { EV << "NodeA " << getFullPath() << " at t=" << simTime() << endl; wait(1); } } class NodeB : public cSimpleModule { public: NodeB() : cSimpleModule(16384) { } virtual void activity() override; }; Define_Module(NodeB); void NodeB::activity() { cMessage *msg = new cMessage("timeout"); for (int i=0; i<10; i++) { EV << "NodeB " << getFullPath() << " at t=" << simTime() << endl; scheduleAt(simTime()+1, msg); msg = receive(); } } class Deleter : public cSimpleModule { public:; virtual void initialize() override; virtual void handleMessage(cMessage *msg) override; }; Define_Module(Deleter); void Deleter::initialize() { scheduleAt(3, new cMessage("timer")); } void Deleter::handleMessage(cMessage *msg) { delete msg; EV << "Deleting nodeA, nodeB at t=" << simTime() << endl; cModule *nodeA = getParentModule()->getSubmodule("nodeA"); cModule *nodeB = getParentModule()->getSubmodule("nodeB"); nodeA->deleteModule(); nodeB->deleteModule(); EV << "Deleted" << endl; } }; //namespace %inifile: test.ini [General] network = Test cmdenv-express-mode = false cmdenv-event-banners = false %contains: stdout NodeA Test.nodeA at t=0 NodeB Test.nodeB at t=0 NodeA Test.nodeA at t=1 NodeB Test.nodeB at t=1 NodeA Test.nodeA at t=2 NodeB Test.nodeB at t=2 Deleting nodeA, nodeB at t=3 Deleted