Browse Source

list of request callbacks

pull/2072/head
orignal 7 months ago
parent
commit
0f7db8e418
  1. 45
      libi2pd/NetDbRequests.cpp
  2. 12
      libi2pd/NetDbRequests.h

45
libi2pd/NetDbRequests.cpp

@ -29,7 +29,7 @@ namespace data
RequestedDestination::~RequestedDestination () RequestedDestination::~RequestedDestination ()
{ {
if (m_RequestComplete) m_RequestComplete (nullptr); InvokeRequestComplete (nullptr);
} }
std::shared_ptr<I2NPMessage> RequestedDestination::CreateRequestMessage (std::shared_ptr<const RouterInfo> router, std::shared_ptr<I2NPMessage> RequestedDestination::CreateRequestMessage (std::shared_ptr<const RouterInfo> router,
@ -68,17 +68,23 @@ namespace data
{ {
m_ExcludedPeers.clear (); m_ExcludedPeers.clear ();
} }
void RequestedDestination::InvokeRequestComplete (std::shared_ptr<RouterInfo> r)
{
if (!m_RequestComplete.empty ())
{
for (auto it: m_RequestComplete)
if (it != nullptr) it (r);
m_RequestComplete.clear ();
}
}
void RequestedDestination::Success (std::shared_ptr<RouterInfo> r) void RequestedDestination::Success (std::shared_ptr<RouterInfo> r)
{ {
if (m_IsActive) if (m_IsActive)
{ {
m_IsActive = false; m_IsActive = false;
if (m_RequestComplete) InvokeRequestComplete (r);
{
m_RequestComplete (r);
m_RequestComplete = nullptr;
}
} }
} }
@ -87,11 +93,7 @@ namespace data
if (m_IsActive) if (m_IsActive)
{ {
m_IsActive = false; m_IsActive = false;
if (m_RequestComplete) InvokeRequestComplete (nullptr);
{
m_RequestComplete (nullptr);
m_RequestComplete = nullptr;
}
} }
} }
@ -154,27 +156,22 @@ namespace data
{ {
// request RouterInfo directly // request RouterInfo directly
auto dest = m_RequestedDestinationsPool.AcquireSharedMt (destination, isExploratory, direct); auto dest = m_RequestedDestinationsPool.AcquireSharedMt (destination, isExploratory, direct);
dest->SetRequestComplete (requestComplete); if (requestComplete)
dest->AddRequestComplete (requestComplete);
{ {
std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex); std::unique_lock<std::mutex> l(m_RequestedDestinationsMutex);
auto ret = m_RequestedDestinations.emplace (destination, dest); auto ret = m_RequestedDestinations.emplace (destination, dest);
if (!ret.second) // not inserted if (!ret.second) // not inserted
{ {
dest->SetRequestComplete (nullptr); // don't call requestComplete in destructor dest->ResetRequestComplete (); // don't call requestComplete in destructor
dest = ret.first->second; // existing one dest = ret.first->second; // existing one
if (requestComplete && dest->IsActive ()) if (requestComplete)
{ {
auto prev = dest->GetRequestComplete (); if (dest->IsActive ())
if (prev) // if already set dest->AddRequestComplete (requestComplete);
dest->SetRequestComplete (
[requestComplete, prev](std::shared_ptr<RouterInfo> r)
{
prev (r); // call previous
requestComplete (r); // then new
});
else else
dest->SetRequestComplete (requestComplete); requestComplete (nullptr);
} }
return nullptr; return nullptr;
} }
} }

12
libi2pd/NetDbRequests.h

@ -13,6 +13,7 @@
#include <memory> #include <memory>
#include <unordered_set> #include <unordered_set>
#include <unordered_map> #include <unordered_map>
#include <list>
#include "Identity.h" #include "Identity.h"
#include "RouterInfo.h" #include "RouterInfo.h"
#include "util.h" #include "util.h"
@ -53,19 +54,22 @@ namespace data
std::shared_ptr<I2NPMessage> CreateRequestMessage (std::shared_ptr<const RouterInfo>, std::shared_ptr<const i2p::tunnel::InboundTunnel> replyTunnel); std::shared_ptr<I2NPMessage> CreateRequestMessage (std::shared_ptr<const RouterInfo>, std::shared_ptr<const i2p::tunnel::InboundTunnel> replyTunnel);
std::shared_ptr<I2NPMessage> CreateRequestMessage (const IdentHash& floodfill); std::shared_ptr<I2NPMessage> CreateRequestMessage (const IdentHash& floodfill);
void SetRequestComplete (const RequestComplete& requestComplete) { m_RequestComplete = requestComplete; }; void AddRequestComplete (const RequestComplete& requestComplete) { m_RequestComplete.push_back (requestComplete); };
RequestComplete GetRequestComplete () const { return m_RequestComplete; }; void ResetRequestComplete () { m_RequestComplete.clear (); };
bool IsRequestComplete () const { return m_RequestComplete != nullptr; };
void Success (std::shared_ptr<RouterInfo> r); void Success (std::shared_ptr<RouterInfo> r);
void Fail (); void Fail ();
private:
void InvokeRequestComplete (std::shared_ptr<RouterInfo> r);
private: private:
IdentHash m_Destination; IdentHash m_Destination;
bool m_IsExploratory, m_IsDirect, m_IsActive; bool m_IsExploratory, m_IsDirect, m_IsActive;
std::unordered_set<IdentHash> m_ExcludedPeers; std::unordered_set<IdentHash> m_ExcludedPeers;
uint64_t m_CreationTime, m_LastRequestTime; // in seconds uint64_t m_CreationTime, m_LastRequestTime; // in seconds
RequestComplete m_RequestComplete; std::list<RequestComplete> m_RequestComplete;
int m_NumAttempts; int m_NumAttempts;
}; };

Loading…
Cancel
Save