diff --git a/NetDb.cpp b/NetDb.cpp index 80b36db5..dca9900d 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -23,7 +23,7 @@ namespace data { NetDb netdb; - NetDb::NetDb (): m_IsRunning (false), m_Thread (nullptr), m_Reseeder (nullptr), m_Storage("netDb", "r", "routerInfo-", "dat"), m_HiddenMode(false) + NetDb::NetDb (): m_Ready(new std::promise()), m_IsRunning (false), m_Thread (nullptr), m_Reseeder (nullptr), m_Storage("netDb", "r", "routerInfo-", "dat"), m_HiddenMode(false) { } @@ -38,13 +38,14 @@ namespace data m_Storage.SetPlace(i2p::fs::GetDataDir()); m_Storage.Init(i2p::data::GetBase64SubstitutionTable(), 64); InitProfilesStorage (); - m_Families.LoadCertificates (); + m_Families.LoadCertificates (); Load (); if (m_RouterInfos.size () < 25) // reseed if # of router less than 50 Reseed (); m_IsRunning = true; m_Thread = new std::thread (std::bind (&NetDb::Run, this)); + m_Ready->set_value(); } void NetDb::Stop () @@ -68,7 +69,14 @@ namespace data m_Requests.Stop (); } } - + + void NetDb::WaitForReady() + { + m_Ready->get_future().wait(); + delete m_Ready; + m_Ready = nullptr; + } + void NetDb::Run () { uint32_t lastSave = 0, lastPublish = 0, lastExploratory = 0, lastManageRequest = 0, lastDestinationCleanup = 0; diff --git a/NetDb.h b/NetDb.h index 12d667d3..7cf2730e 100644 --- a/NetDb.h +++ b/NetDb.h @@ -8,6 +8,7 @@ #include #include #include +#include #include "Base.h" #include "Gzip.h" @@ -48,7 +49,9 @@ namespace data void Start (); void Stop (); - + /** block until netdb is ready, call only once*/ + void WaitForReady(); + bool AddRouterInfo (const uint8_t * buf, int len); bool AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len); bool AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, std::shared_ptr from); @@ -109,7 +112,8 @@ namespace data std::shared_ptr GetRandomRouter (Filter filter) const; private: - + std::promise * m_Ready; + mutable std::mutex m_LeaseSetsMutex; std::map > m_LeaseSets; mutable std::mutex m_RouterInfosMutex;