Browse Source

fixed addressbook crash at shutdown

pull/173/head
orignal 10 years ago
parent
commit
12641ab0c0
  1. 32
      AddressBook.cpp
  2. 7
      AddressBook.h
  3. 5
      ClientContext.cpp

32
AddressBook.cpp

@ -151,13 +151,29 @@ namespace client
} }
//--------------------------------------------------------------------- //---------------------------------------------------------------------
AddressBook::AddressBook (): m_IsLoaded (false), m_IsDownloading (false), AddressBook::AddressBook (): m_Storage (nullptr), m_IsLoaded (false), m_IsDownloading (false),
m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr) m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr)
{ {
} }
AddressBook::~AddressBook () AddressBook::~AddressBook ()
{ {
Stop ();
}
void AddressBook::Start ()
{
StartSubscriptions ();
}
void AddressBook::Stop ()
{
StopSubscriptions ();
if (m_SubscriptionsUpdateTimer)
{
delete m_SubscriptionsUpdateTimer;
m_SubscriptionsUpdateTimer = nullptr;
}
if (m_IsDownloading) if (m_IsDownloading)
{ {
LogPrint (eLogInfo, "Subscription is downloading. Waiting for temination..."); LogPrint (eLogInfo, "Subscription is downloading. Waiting for temination...");
@ -171,18 +187,24 @@ namespace client
std::this_thread::sleep_for (std::chrono::seconds (1)); // wait for 1 seconds std::this_thread::sleep_for (std::chrono::seconds (1)); // wait for 1 seconds
} }
LogPrint (eLogError, "Subscription download hangs"); LogPrint (eLogError, "Subscription download hangs");
m_IsDownloading = false;
} }
if (m_Storage) if (m_Storage)
{ {
m_Storage->Save (m_Addresses); m_Storage->Save (m_Addresses);
delete m_Storage; delete m_Storage;
m_Storage = nullptr;
} }
delete m_DefaultSubscription; if (m_DefaultSubscription)
{
delete m_DefaultSubscription;
m_DefaultSubscription = nullptr;
}
for (auto it: m_Subscriptions) for (auto it: m_Subscriptions)
delete it; delete it;
delete m_SubscriptionsUpdateTimer; m_Subscriptions.clear ();
} }
AddressBookStorage * AddressBook::CreateStorage () AddressBookStorage * AddressBook::CreateStorage ()
{ {
return new AddressBookFilesystemStorage (); return new AddressBookFilesystemStorage ();

7
AddressBook.h

@ -46,14 +46,14 @@ namespace client
AddressBook (); AddressBook ();
~AddressBook (); ~AddressBook ();
void Start ();
void Stop ();
bool GetIdentHash (const std::string& address, i2p::data::IdentHash& ident); bool GetIdentHash (const std::string& address, i2p::data::IdentHash& ident);
bool GetAddress (const std::string& address, i2p::data::IdentityEx& identity); bool GetAddress (const std::string& address, i2p::data::IdentityEx& identity);
const i2p::data::IdentHash * FindAddress (const std::string& address); const i2p::data::IdentHash * FindAddress (const std::string& address);
void InsertAddress (const std::string& address, const std::string& base64); // for jump service void InsertAddress (const std::string& address, const std::string& base64); // for jump service
void InsertAddress (const i2p::data::IdentityEx& address); void InsertAddress (const i2p::data::IdentityEx& address);
void StartSubscriptions ();
void StopSubscriptions ();
void LoadHostsFromStream (std::istream& f); void LoadHostsFromStream (std::istream& f);
void DownloadComplete (bool success); void DownloadComplete (bool success);
//This method returns the ".b32.i2p" address //This method returns the ".b32.i2p" address
@ -61,6 +61,9 @@ namespace client
std::string ToAddress(const i2p::data::IdentityEx& ident) { return ToAddress(ident.GetIdentHash ()); } std::string ToAddress(const i2p::data::IdentityEx& ident) { return ToAddress(ident.GetIdentHash ()); }
private: private:
void StartSubscriptions ();
void StopSubscriptions ();
AddressBookStorage * CreateStorage (); AddressBookStorage * CreateStorage ();
void LoadHosts (); void LoadHosts ();
void LoadSubscriptions (); void LoadSubscriptions ();

5
ClientContext.cpp

@ -101,12 +101,11 @@ namespace client
m_I2PControlService->Start (); m_I2PControlService->Start ();
LogPrint("I2PControl started"); LogPrint("I2PControl started");
} }
m_AddressBook.StartSubscriptions (); m_AddressBook.Start ();
} }
void ClientContext::Stop () void ClientContext::Stop ()
{ {
m_AddressBook.StopSubscriptions ();
m_HttpProxy->Stop(); m_HttpProxy->Stop();
delete m_HttpProxy; delete m_HttpProxy;
m_HttpProxy = nullptr; m_HttpProxy = nullptr;
@ -148,7 +147,7 @@ namespace client
m_I2PControlService = nullptr; m_I2PControlService = nullptr;
LogPrint("I2PControl stopped"); LogPrint("I2PControl stopped");
} }
m_AddressBook.Stop ();
for (auto it: m_Destinations) for (auto it: m_Destinations)
it.second->Stop (); it.second->Stop ();
m_Destinations.clear (); m_Destinations.clear ();

Loading…
Cancel
Save