diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp index 3c7fc245f2f9e0060cb3c61b1bcb8b1d7fe95f30..38b463f80fc9506abab0b6f175e1bb7425a064e1 100644 --- a/src/jamidht/jamiaccount.cpp +++ b/src/jamidht/jamiaccount.cpp @@ -1846,29 +1846,6 @@ JamiAccount::trackBuddyPresence(const std::string& buddy_id, bool track) } auto h = dht::InfoHash(buddyUri); - if (!track && dht_ && dht_->isRunning()) { - // Remove current connections with contact - std::set<DeviceId> devices; - { - std::unique_lock<std::mutex> lk(sipConnsMtx_); - for (auto it = sipConns_.begin(); it != sipConns_.end();) { - const auto& [key, value] = *it; - if (key.first == buddyUri) { - devices.emplace(key.second); - it = sipConns_.erase(it); - } else { - ++it; - } - } - } - - std::lock_guard<std::mutex> lk(connManagerMtx_); - for (const auto& device : devices) { - if (connectionManager_) - connectionManager_->closeConnectionsWith(device); - } - } - std::lock_guard<std::mutex> lock(buddyInfoMtx); if (track) { auto buddy = trackedBuddies_.emplace(h, BuddyInfo {h}); @@ -3114,19 +3091,31 @@ JamiAccount::removeContact(const std::string& uri, bool ban) } // Remove current connections with contact - std::set<DeviceId> devices; - { - std::unique_lock<std::mutex> lk(sipConnsMtx_); - for (auto it = sipConns_.begin(); it != sipConns_.end();) { - const auto& [key, value] = *it; - if (key.first == uri) { - devices.emplace(key.second); - it = sipConns_.erase(it); - } else { - ++it; + dht::ThreadPool::io().run([w = weak(), uri] { + auto shared = w.lock(); + if (!shared) + return; + // Remove current connections with contact + std::set<DeviceId> devices; + { + std::unique_lock<std::mutex> lk(shared->sipConnsMtx_); + for (auto it = shared->sipConns_.begin(); it != shared->sipConns_.end();) { + const auto& [key, value] = *it; + if (key.first == uri) { + devices.emplace(key.second); + it = shared->sipConns_.erase(it); + } else { + ++it; + } } } - } + + std::lock_guard<std::mutex> lk(shared->connManagerMtx_); + if (!shared->connectionManager_) + return; + for (const auto& device : devices) + shared->connectionManager_->closeConnectionsWith(device); + }); } std::map<std::string, std::string>