@@ -117,6 +117,11 @@ void SharedMemoryManager::handleSenderPorts()
117117 // forward to interfaces
118118 sendToAllMatchingInterfacePorts (caproMessage, l_senderPort.getInterface ());
119119 }
120+ // check if we have to destroy this sender port
121+ if (l_senderPort.toBeDestroyed ())
122+ {
123+ destroySenderPort (l_senderPortData);
124+ }
120125 }
121126}
122127
@@ -141,6 +146,11 @@ void SharedMemoryManager::handleReceiverPorts()
141146 l_receiverPort.dispatchCaProMessage (nackMessage);
142147 }
143148 }
149+ // check if we have to destroy this sender port
150+ if (l_receiverPort.toBeDestroyed ())
151+ {
152+ destroyReceiverPort (l_receiverPortData);
153+ }
144154 }
145155}
146156
@@ -344,21 +354,7 @@ void SharedMemoryManager::deletePortsOfProcess(std::string f_processName)
344354 SenderPortType l_sender (port);
345355 if (f_processName == l_sender.getApplicationName ())
346356 {
347- const auto & serviceDescription = l_sender.getCaProServiceDescription ();
348- removeEntryFromServiceRegistry (serviceDescription.getServiceIDString (),
349- serviceDescription.getInstanceIDString ());
350- l_sender.cleanup ();
351-
352- capro::CaproMessage message (capro::CaproMessageType::STOP_OFFER, serviceDescription);
353- m_portIntrospection.reportMessage (message);
354-
355- sendToAllMatchingReceiverPorts (message, l_sender);
356-
357- m_portIntrospection.removeSender (f_processName, serviceDescription);
358-
359- // delete sender impl from list after StopOffer was processed
360- l_shm->m_senderPortMembers .erase (port);
361- DEBUG_PRINTF (" Deleted SenderPortImpl of application %s\n " , f_processName.c_str ());
357+ destroySenderPort (port);
362358 }
363359 }
364360
@@ -367,21 +363,7 @@ void SharedMemoryManager::deletePortsOfProcess(std::string f_processName)
367363 ReceiverPortType l_receiver (port);
368364 if (f_processName == l_receiver.getApplicationName ())
369365 {
370- // do the complete cleanup for the receiver port for being able to erase it
371- l_receiver.cleanup ();
372-
373- const auto & serviceDescription = l_receiver.getCaProServiceDescription ();
374- capro::CaproMessage message (capro::CaproMessageType::UNSUB, serviceDescription);
375- message.m_requestPort = port;
376- m_portIntrospection.reportMessage (message);
377-
378- sendToAllMatchingSenderPorts (message, l_receiver);
379-
380- m_portIntrospection.removeReceiver (f_processName, serviceDescription);
381-
382- // delete receiver impl from list after unsubscribe was processed
383- l_shm->m_receiverPortMembers .erase (port);
384- DEBUG_PRINTF (" Deleted ReceiverPortImpl of application %s\n " , f_processName.c_str ());
366+ destroyReceiverPort (port);
385367 }
386368 }
387369
@@ -435,6 +417,49 @@ void SharedMemoryManager::deleteRunnableAndItsPorts(std::string f_runnableName)
435417 }
436418}
437419
420+ void SharedMemoryManager::destroySenderPort (SenderPortType::MemberType_t* const senderPortData)
421+ {
422+ SenderPortType senderPort (senderPortData);
423+
424+ const auto & serviceDescription = senderPort.getCaProServiceDescription ();
425+ removeEntryFromServiceRegistry (serviceDescription.getServiceIDString (), serviceDescription.getInstanceIDString ());
426+ senderPort.cleanup ();
427+
428+ const capro::CaproMessage message (capro::CaproMessageType::STOP_OFFER, serviceDescription);
429+ m_portIntrospection.reportMessage (message);
430+
431+ sendToAllMatchingReceiverPorts (message, senderPort);
432+ sendToAllMatchingInterfacePorts (message, senderPort.getInterface ());
433+
434+ m_portIntrospection.removeSender (senderPort.getApplicationName (), serviceDescription);
435+
436+ // delete sender impl from list after StopOffer was processed
437+ const auto shm = m_ShmInterface.getShmInterface ();
438+ shm->m_senderPortMembers .erase (senderPortData);
439+ DEBUG_PRINTF (" Destroyed SenderPortImpl\n " );
440+ }
441+
442+ void SharedMemoryManager::destroyReceiverPort (ReceiverPortType::MemberType_t* const receiverPortData)
443+ {
444+ ReceiverPortType receiverPort (receiverPortData);
445+
446+ receiverPort.cleanup ();
447+
448+ const auto & serviceDescription = receiverPort.getCaProServiceDescription ();
449+ capro::CaproMessage message (capro::CaproMessageType::UNSUB, serviceDescription);
450+ message.m_requestPort = receiverPortData;
451+ m_portIntrospection.reportMessage (message);
452+
453+ sendToAllMatchingSenderPorts (message, receiverPort);
454+
455+ m_portIntrospection.removeReceiver (receiverPort.getApplicationName (), serviceDescription);
456+
457+ // delete receiver impl from list after unsubscribe was processed
458+ const auto shm = m_ShmInterface.getShmInterface ();
459+ shm->m_receiverPortMembers .erase (receiverPortData);
460+ DEBUG_PRINTF (" Destroyed ReceiverPortImpl\n " );
461+ }
462+
438463std::string SharedMemoryManager::GetShmAddrString ()
439464{
440465 return m_ShmInterface.getBaseAddrString ();
0 commit comments