IXWebSocket/ixwebsocket/IXDNSLookup.h

68 lines
2.0 KiB
C
Raw Normal View History

2018-12-15 01:28:11 +01:00
/*
* IXDNSLookup.h
* Author: Benjamin Sergeant
* Copyright (c) 2018 Machine Zone, Inc. All rights reserved.
*
* Resolve a hostname+port to a struct addrinfo obtained with getaddrinfo
* Does this in a background thread so that it can be cancelled, since
* getaddrinfo is a blocking call, and we don't want to block the main thread on Mobile.
*/
#pragma once
#include "IXCancellationRequest.h"
#include <string>
#include <thread>
#include <atomic>
#include <condition_variable>
2018-12-15 02:49:42 +01:00
#include <set>
2018-12-15 01:28:11 +01:00
struct addrinfo;
namespace ix
{
class DNSLookup {
public:
DNSLookup(const std::string& hostname,
int port,
2018-12-23 23:14:38 +01:00
int64_t wait = DNSLookup::kDefaultWait);
2018-12-15 01:28:11 +01:00
~DNSLookup();
struct addrinfo* resolve(std::string& errMsg,
const CancellationRequest& isCancellationRequested,
bool blocking = false);
private:
struct addrinfo* resolveAsync(std::string& errMsg,
const CancellationRequest& isCancellationRequested);
struct addrinfo* resolveBlocking(std::string& errMsg,
const CancellationRequest& isCancellationRequested);
static struct addrinfo* getAddrInfo(const std::string& hostname,
int port,
std::string& errMsg);
void run(); // thread runner
std::string _hostname;
int _port;
2018-12-23 23:14:38 +01:00
int64_t _wait;
2018-12-15 01:28:11 +01:00
std::string _errMsg;
struct addrinfo* _res;
std::atomic<bool> _done;
std::thread _thread;
std::condition_variable _condition;
2018-12-15 02:49:42 +01:00
std::mutex _conditionVariableMutex;
std::atomic<uint64_t> _id;
static std::atomic<uint64_t> _nextId;
static std::set<uint64_t> _activeJobs;
static std::mutex _activeJobsMutex;
2018-12-15 01:28:11 +01:00
const static int64_t kDefaultTimeout;
const static int64_t kDefaultWait;
};
}