diff --git a/Garlic.cpp b/Garlic.cpp index f4ca1f06..290b9b79 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -94,26 +94,16 @@ namespace garlic void GarlicRoutingSession::TagsConfirmed (uint32_t msgID) { uint32_t ts = i2p::util::GetSecondsSinceEpoch (); - for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();) + auto it = m_UnconfirmedTagsMsgs.find (msgID); + if (it != m_UnconfirmedTagsMsgs.end ()) { - auto& tags = *it; - if (tags->msgID == msgID) - { - if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT) - { - for (int i = 0; i < tags->numTags; i++) - m_SessionTags.push_back (tags->sessionTags[i]); - } - it = m_UnconfirmedTagsMsgs.erase (it); - } - else if (ts >= tags->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT) - { - if (m_Owner) - m_Owner->RemoveDeliveryStatusSession (tags->msgID); - it = m_UnconfirmedTagsMsgs.erase (it); + auto& tags = it->second; + if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT) + { + for (int i = 0; i < tags->numTags; i++) + m_SessionTags.push_back (tags->sessionTags[i]); } - else - ++it; + m_UnconfirmedTagsMsgs.erase (it); } } @@ -144,10 +134,10 @@ namespace garlic // delete expired unconfirmed tags for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();) { - if (ts >= (*it)->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT) + if (ts >= it->second->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT) { if (m_Owner) - m_Owner->RemoveDeliveryStatusSession ((*it)->msgID); + m_Owner->RemoveDeliveryStatusSession (it->first); it = m_UnconfirmedTagsMsgs.erase (it); ret = true; } @@ -284,7 +274,7 @@ namespace garlic if (newTags) // new tags created { newTags->msgID = msgID; - m_UnconfirmedTagsMsgs.emplace_back (newTags); + m_UnconfirmedTagsMsgs.emplace (msgID, std::unique_ptr(newTags)); newTags = nullptr; // got acquired } m_Owner->DeliveryStatusSent (shared_from_this (), msgID); diff --git a/Garlic.h b/Garlic.h index 7cbf3d6f..010338cd 100644 --- a/Garlic.h +++ b/Garlic.h @@ -131,7 +131,7 @@ namespace garlic i2p::crypto::AESKey m_SessionKey; std::list m_SessionTags; int m_NumTags; - std::list > m_UnconfirmedTagsMsgs; + std::map > m_UnconfirmedTagsMsgs; // msgID->tags LeaseSetUpdateStatus m_LeaseSetUpdateStatus; uint32_t m_LeaseSetUpdateMsgID;