diff --git a/daemon/src/iax/iaxvoiplink.cpp b/daemon/src/iax/iaxvoiplink.cpp index 4cb44a96612c5230e0f90b4551775ace22f02200..0e6e6376338113c88c357b9afece434017ee5b97 100644 --- a/daemon/src/iax/iaxvoiplink.cpp +++ b/daemon/src/iax/iaxvoiplink.cpp @@ -41,7 +41,7 @@ #include "array_size.h" #include <cmath> -#include <dlfcn.h> +#include <algorithm> AccountMap IAXVoIPLink::iaxAccountMap_; IAXCallMap IAXVoIPLink::iaxCallMap_; @@ -716,3 +716,10 @@ void IAXVoIPLink::iaxHandlePrecallEvent(iax_event* event) break; } } + +void +IAXVoIPLink::unloadAccountMap() +{ + std::for_each(iaxAccountMap_.begin(), iaxAccountMap_.end(), unloadAccount); + iaxAccountMap_.clear(); +} diff --git a/daemon/src/iax/iaxvoiplink.h b/daemon/src/iax/iaxvoiplink.h index 325c2459e4026753dd94ab7b265be6d7082fea9f..b230cd8e19f99bc61709c3fd239d9be71e8b89b9 100644 --- a/daemon/src/iax/iaxvoiplink.h +++ b/daemon/src/iax/iaxvoiplink.h @@ -72,10 +72,15 @@ class IAXVoIPLink : public VoIPLink { virtual bool getEvent(); /** - * Return the internal account map for this VOIP link + * Return the internal account map for all VOIP links */ static AccountMap &getAccounts() { return iaxAccountMap_; } + /** + * Empty the account map for all VOIP links + */ + static void unloadAccountMap(); + /** * Init the voip link */ diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp index ddd7943346de9d89e3fc74c3c2ca537cd0338d2d..f80738ac02fc60fa43ba057c50d855c3a0aa09e2 100644 --- a/daemon/src/managerimpl.cpp +++ b/daemon/src/managerimpl.cpp @@ -163,9 +163,9 @@ void ManagerImpl::finish() unregisterAllAccounts(); SIPVoIPLink::destroy(); - // Unload account map AFTER destroying - // the SIPVoIPLink, the link still needs the accounts for pjsip cleanup - unloadAccountMap(); +#if HAVE_IAX + IAXVoIPLink::unloadAccountMap(); +#endif { ost::MutexLock lock(audioLayerMutex_); @@ -2582,15 +2582,6 @@ namespace { item.second->unregisterVoIPLink(); } - void unloadAccount(std::pair<const std::string, Account*> &item) - { - // avoid deleting IP2IP account twice - if (not item.first.empty()) { - delete item.second; - item.second = 0; - } - } - SIPAccount *createIP2IPAccount() { SIPAccount *ip2ip = new SIPAccount(SIPAccount::IP2IP_PROFILE); @@ -2681,17 +2672,6 @@ void ManagerImpl::unregisterAllAccounts() #endif } -void ManagerImpl::unloadAccountMap() -{ - std::for_each(SIPVoIPLink::instance()->getAccounts().begin(), SIPVoIPLink::instance()->getAccounts().end(), unloadAccount); - SIPVoIPLink::instance()->getAccounts().clear(); - -#if HAVE_IAX - std::for_each(IAXVoIPLink::getAccounts().begin(), IAXVoIPLink::getAccounts().end(), unloadAccount); - IAXVoIPLink::getAccounts().clear(); -#endif -} - bool ManagerImpl::accountExists(const std::string &accountID) { bool ret = false; diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h index 457c544f66a1b81a43848eb8a43e2b91163194d9..a46d53b0226190de8be2a6ecd243943a670fb227 100644 --- a/daemon/src/managerimpl.h +++ b/daemon/src/managerimpl.h @@ -994,11 +994,6 @@ class ManagerImpl { */ void loadDefaultAccountMap(); - /** - * Unload the account (delete them) - */ - void unloadAccountMap(); - /** * Instance of the MainBuffer for the whole application * diff --git a/daemon/src/sip/sipvoiplink.cpp b/daemon/src/sip/sipvoiplink.cpp index b9028fb11aa49e77f36cd0edaeae292a6c37c629..f60f4435e5264d6bf0ec36791504004fa4755964 100644 --- a/daemon/src/sip/sipvoiplink.cpp +++ b/daemon/src/sip/sipvoiplink.cpp @@ -74,6 +74,7 @@ #include <istream> // #include <fstream> #include <utility> // for std::pair +#include <algorithm> #include <map> @@ -517,6 +518,9 @@ SIPVoIPLink::~SIPVoIPLink() pj_shutdown(); clearSipCallMap(); + + std::for_each(sipAccountMap_.begin(), sipAccountMap_.end(), unloadAccount); + sipAccountMap_.clear(); } SIPVoIPLink* SIPVoIPLink::instance() diff --git a/daemon/src/voiplink.cpp b/daemon/src/voiplink.cpp index cd95b30612e8ccaaf674bdb4ac6d03e6d5993033..8225400b42a565ff166ae198e3c76a650fd19f66 100644 --- a/daemon/src/voiplink.cpp +++ b/daemon/src/voiplink.cpp @@ -31,10 +31,17 @@ * as that of the covered work. */ -#include "call.h" -#include "logger.h" #include "voiplink.h" VoIPLink::VoIPLink() : handlingEvents_(false) {} VoIPLink::~VoIPLink() {} + +void VoIPLink::unloadAccount(std::pair<const std::string, Account*> &item) +{ + // avoid deleting a nameless account twice + if (not item.first.empty()) { + delete item.second; + item.second = 0; + } +} diff --git a/daemon/src/voiplink.h b/daemon/src/voiplink.h index cd1ea16029dba6fb24d8a466a610996254748b04..d8cef2fe328179fdb8a160f60732e0901681d4c8 100644 --- a/daemon/src/voiplink.h +++ b/daemon/src/voiplink.h @@ -35,10 +35,7 @@ #define __VOIP_LINK_H__ #include <stdexcept> -#include <map> - -#include "cc_thread.h" // for ost::Mutex -#include "account.h" +#include <string> class Call; class Account; @@ -166,7 +163,7 @@ class VoIPLink { #endif protected: - + static void unloadAccount(std::pair<const std::string, Account*> &item); bool handlingEvents_; };