%description: Tests deletion of an activity() simple module which (a) stays inside a wait() call (b) stays inside a receive() call and has scheduled events. %file: {}.ned simple {NodeA} endsimple simple {NodeB} endsimple simple {Deleter} endsimple module {Net} submodules: nodeA: {NodeA}; nodeB: {NodeB}; deleter: {Deleter}; endmodule network {network} : {Net}; endnetwork %file: {}.cc #include class {NodeA} : public cSimpleModule { Module_Class_Members({NodeA},cSimpleModule,16384) virtual void activity(); }; Define_Module({NodeA}); void {NodeA}::activity() { for (int i=0; i<10; i++) { ev << "NodeA " << fullPath() << " at t=" << simTime() << endl; wait(1); } } class {NodeB} : public cSimpleModule { Module_Class_Members({NodeB},cSimpleModule,16384) virtual void activity(); }; Define_Module({NodeB}); void {NodeB}::activity() { cMessage *msg = new cMessage("timeout"); for (int i=0; i<10; i++) { ev << "NodeB " << fullPath() << " at t=" << simTime() << endl; scheduleAt(simTime()+1, msg); msg = receive(); } } class {Deleter} : public cSimpleModule { Module_Class_Members({Deleter},cSimpleModule,16384) virtual void activity(); }; Define_Module({Deleter}); void {Deleter}::activity() { wait(3); ev << "Deleting nodeA, nodeB at t=" << simTime() << endl; cModule *nodeA = parentModule()->submodule("nodeA"); cModule *nodeB = parentModule()->submodule("nodeB"); nodeA->deleteModule(); nodeB->deleteModule(); ev << "Deleted" << endl; wait(2); ev << "Still here at t=" << simTime() << endl; } %inifile: {}.ini [General] network={network} [Cmdenv] event-banners=no %contains: stdout NodeA {network}.nodeA at t=0 NodeB {network}.nodeB at t=0 NodeA {network}.nodeA at t=1 NodeB {network}.nodeB at t=1 NodeA {network}.nodeA at t=2 NodeB {network}.nodeB at t=2 Deleting nodeA, nodeB at t=3 Deleted Still here at t=5