async dns lookup fix
This commit is contained in:
parent
cbadecab33
commit
bd04b28b9e
@ -18,19 +18,26 @@ namespace ix
|
|||||||
const int64_t DNSLookup::kDefaultTimeout = 60 * 1000; // ms
|
const int64_t DNSLookup::kDefaultTimeout = 60 * 1000; // ms
|
||||||
const int64_t DNSLookup::kDefaultWait = 10; // ms
|
const int64_t DNSLookup::kDefaultWait = 10; // ms
|
||||||
|
|
||||||
|
std::atomic<uint64_t> DNSLookup::_nextId(0);
|
||||||
|
std::set<uint64_t> DNSLookup::_activeJobs;
|
||||||
|
std::mutex DNSLookup::_activeJobsMutex;
|
||||||
|
|
||||||
DNSLookup::DNSLookup(const std::string& hostname, int port, int wait) :
|
DNSLookup::DNSLookup(const std::string& hostname, int port, int wait) :
|
||||||
_hostname(hostname),
|
_hostname(hostname),
|
||||||
_port(port),
|
_port(port),
|
||||||
_res(nullptr),
|
_res(nullptr),
|
||||||
_done(false),
|
_done(false),
|
||||||
_wait(wait)
|
_wait(wait),
|
||||||
|
_id(_nextId++)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DNSLookup::~DNSLookup()
|
DNSLookup::~DNSLookup()
|
||||||
{
|
{
|
||||||
;
|
// Remove this job from the active jobs list
|
||||||
|
std::unique_lock<std::mutex> lock(_activeJobsMutex);
|
||||||
|
_activeJobs.erase(_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct addrinfo* DNSLookup::getAddrInfo(const std::string& hostname,
|
struct addrinfo* DNSLookup::getAddrInfo(const std::string& hostname,
|
||||||
@ -92,6 +99,12 @@ namespace ix
|
|||||||
// if you need a second lookup.
|
// if you need a second lookup.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Record job in the active Job set
|
||||||
|
{
|
||||||
|
std::unique_lock<std::mutex> lock(_activeJobsMutex);
|
||||||
|
_activeJobs.insert(_id);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Good resource on thread forced termination
|
// Good resource on thread forced termination
|
||||||
// https://www.bo-yang.net/2017/11/19/cpp-kill-detached-thread
|
// https://www.bo-yang.net/2017/11/19/cpp-kill-detached-thread
|
||||||
@ -100,7 +113,7 @@ namespace ix
|
|||||||
_thread.detach();
|
_thread.detach();
|
||||||
|
|
||||||
int64_t timeout = kDefaultTimeout;
|
int64_t timeout = kDefaultTimeout;
|
||||||
std::unique_lock<std::mutex> lock(_mutex);
|
std::unique_lock<std::mutex> lock(_conditionVariableMutex);
|
||||||
|
|
||||||
while (!_done)
|
while (!_done)
|
||||||
{
|
{
|
||||||
@ -140,7 +153,20 @@ namespace ix
|
|||||||
|
|
||||||
void DNSLookup::run()
|
void DNSLookup::run()
|
||||||
{
|
{
|
||||||
_res = getAddrInfo(_hostname, _port, _errMsg);
|
uint64_t id = _id;
|
||||||
|
std::string errMsg;
|
||||||
|
_res = getAddrInfo(_hostname, _port, errMsg);
|
||||||
|
|
||||||
|
// if this isn't an active job, and the control thread is gone
|
||||||
|
// there is not thing to do, and we don't want to touch the defunct
|
||||||
|
// object data structure such as _errMsg or _condition
|
||||||
|
std::unique_lock<std::mutex> lock(_activeJobsMutex);
|
||||||
|
if (_activeJobs.count(id) == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_errMsg = errMsg;
|
||||||
_condition.notify_one();
|
_condition.notify_one();
|
||||||
_done = true;
|
_done = true;
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
struct addrinfo;
|
struct addrinfo;
|
||||||
|
|
||||||
@ -53,7 +54,12 @@ namespace ix
|
|||||||
std::atomic<bool> _done;
|
std::atomic<bool> _done;
|
||||||
std::thread _thread;
|
std::thread _thread;
|
||||||
std::condition_variable _condition;
|
std::condition_variable _condition;
|
||||||
std::mutex _mutex;
|
std::mutex _conditionVariableMutex;
|
||||||
|
|
||||||
|
std::atomic<uint64_t> _id;
|
||||||
|
static std::atomic<uint64_t> _nextId;
|
||||||
|
static std::set<uint64_t> _activeJobs;
|
||||||
|
static std::mutex _activeJobsMutex;
|
||||||
|
|
||||||
const static int64_t kDefaultTimeout;
|
const static int64_t kDefaultTimeout;
|
||||||
const static int64_t kDefaultWait;
|
const static int64_t kDefaultWait;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user