diff --git a/src/jamidht/namedirectory.cpp b/src/jamidht/namedirectory.cpp index 192855d76e1e0dec061c21b1228b16484e011194..7edc9d18557718f12ddf0ca8dacab8b207062f9c 100644 --- a/src/jamidht/namedirectory.cpp +++ b/src/jamidht/namedirectory.cpp @@ -77,9 +77,7 @@ NameDirectory::instance() } void -NameDirectory::lookupUri(std::string_view uri, - const std::string& default_server, - LookupCallback cb) +NameDirectory::lookupUri(std::string_view uri, const std::string& default_server, LookupCallback cb) { const std::string& default_ns = default_server.empty() ? DEFAULT_SERVER_HOST : default_server; std::svmatch pieces_match; @@ -92,7 +90,7 @@ NameDirectory::lookupUri(std::string_view uri, return; } } - JAMI_ERR("Can't parse URI: %.*s", (int)uri.size(), uri.data()); + JAMI_ERR("Can't parse URI: %.*s", (int) uri.size(), uri.data()); cb("", Response::invalidResponse); } @@ -108,6 +106,12 @@ NameDirectory::NameDirectory(const std::string& serverUrl, std::shared_ptr<dht:: + DIR_SEPARATOR_STR + resolver_->get_url().host; } +NameDirectory::~NameDirectory() +{ + std::lock_guard<std::mutex> lk(requestsMtx_); + requests_.clear(); +} + void NameDirectory::load() { @@ -172,12 +176,12 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) Json::CharReaderBuilder rbuilder; auto reader = std::unique_ptr<Json::CharReader>(rbuilder.newCharReader()); if (!reader->parse(response.body.data(), - response.body.data() + response.body.size(), - &json, - &err)) { + response.body.data() + response.body.size(), + &json, + &err)) { JAMI_DBG("Address lookup for %s: can't parse server response: %s", - addr.c_str(), - response.body.c_str()); + addr.c_str(), + response.body.c_str()); cb("", Response::error); return; } @@ -199,12 +203,15 @@ NameDirectory::lookupAddress(const std::string& addr, LookupCallback cb) cb("", Response::error); } } + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); }); request->send(); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_[reqid] = request; } catch (const std::exception& e) { JAMI_ERR("Error when performing address lookup: %s", e.what()); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); } } @@ -296,12 +303,15 @@ NameDirectory::lookupName(const std::string& n, LookupCallback cb) cb("", Response::error); } } + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); }); request->send(); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_[reqid] = request; } catch (const std::exception& e) { JAMI_ERR("Name lookup for %s failed: %s", name.c_str(), e.what()); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); } } @@ -399,13 +409,16 @@ NameDirectory::registerName(const std::string& addr, } cb(success ? RegistrationResponse::success : RegistrationResponse::error); } + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); }); request->send(); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_[reqid] = request; } catch (const std::exception& e) { JAMI_ERR("Error when performing name registration: %s", e.what()); cb(RegistrationResponse::error); + std::lock_guard<std::mutex> lk(requestsMtx_); requests_.erase(reqid); } } diff --git a/src/jamidht/namedirectory.h b/src/jamidht/namedirectory.h index 7e96464df047515be161066114b74cbe5444c0d8..0ae8ecb6b0af1c73fb49a3104890977f4525cf61 100644 --- a/src/jamidht/namedirectory.h +++ b/src/jamidht/namedirectory.h @@ -67,6 +67,7 @@ public: using RegistrationCallback = std::function<void(RegistrationResponse response)>; NameDirectory(const std::string& serverUrl, std::shared_ptr<dht::Logger> l = {}); + ~NameDirectory(); void load(); static NameDirectory& instance(const std::string& serverUrl, @@ -108,6 +109,7 @@ private: */ std::shared_ptr<asio::io_context> httpContext_; std::shared_ptr<dht::http::Resolver> resolver_; + std::mutex requestsMtx_ {}; std::map<unsigned, std::shared_ptr<dht::http::Request>> requests_; std::map<std::string, std::string> nameCache_ {};