diff --git a/Garlic.cpp b/Garlic.cpp index 35c8bc15..f4ca1f06 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -650,37 +650,48 @@ namespace garlic } } // delivery status sessions - for (auto it = m_DeliveryStatusSessions.begin (); it != m_DeliveryStatusSessions.end (); ) - { - if (it->second->GetOwner () != this) - it = m_DeliveryStatusSessions.erase (it); - else - ++it; + { + std::unique_lock l(m_DeliveryStatusSessionsMutex); + for (auto it = m_DeliveryStatusSessions.begin (); it != m_DeliveryStatusSessions.end (); ) + { + if (it->second->GetOwner () != this) + it = m_DeliveryStatusSessions.erase (it); + else + ++it; + } } } void GarlicDestination::RemoveDeliveryStatusSession (uint32_t msgID) { + std::unique_lock l(m_DeliveryStatusSessionsMutex); m_DeliveryStatusSessions.erase (msgID); } void GarlicDestination::DeliveryStatusSent (GarlicRoutingSessionPtr session, uint32_t msgID) { + std::unique_lock l(m_DeliveryStatusSessionsMutex); m_DeliveryStatusSessions[msgID] = session; } void GarlicDestination::HandleDeliveryStatusMessage (std::shared_ptr msg) { uint32_t msgID = bufbe32toh (msg->GetPayload ()); + GarlicRoutingSessionPtr session; { + std::unique_lock l(m_DeliveryStatusSessionsMutex); auto it = m_DeliveryStatusSessions.find (msgID); if (it != m_DeliveryStatusSessions.end ()) { - it->second->MessageConfirmed (msgID); + session = it->second; m_DeliveryStatusSessions.erase (it); - LogPrint (eLogDebug, "Garlic: message ", msgID, " acknowledged"); } } + if (session) + { + session->MessageConfirmed (msgID); + LogPrint (eLogDebug, "Garlic: message ", msgID, " acknowledged"); + } } void GarlicDestination::SetLeaseSetUpdated () diff --git a/Garlic.h b/Garlic.h index e0e65111..7cbf3d6f 100644 --- a/Garlic.h +++ b/Garlic.h @@ -195,6 +195,7 @@ namespace garlic // incoming std::map> m_Tags; // DeliveryStatus + std::mutex m_DeliveryStatusSessionsMutex; std::map m_DeliveryStatusSessions; // msgID -> session public: