AsyncResolver: remove dependency on SignalThread.
This change removes dependency on SignalThread which is a heavy user of re-entered mutexes, and is a step to being able to delete SignalThread. The new AsyncResolver is based on task queue instead. Bug: webrtc:11567, webrtc:7723 Change-Id: Iab125ccbc0fb9d72af44341e58f89b3868c952cb Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175910 Commit-Queue: Markus Handell <handellm@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31361}
This commit is contained in:
committed by
Commit Bot
parent
0d4647dffe
commit
fbf4ad2958
@ -10,8 +10,6 @@
|
||||
|
||||
#include "rtc_base/net_helpers.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#if defined(WEBRTC_WIN)
|
||||
#include <ws2spi.h>
|
||||
#include <ws2tcpip.h>
|
||||
@ -26,8 +24,11 @@
|
||||
#endif
|
||||
#endif // defined(WEBRTC_POSIX) && !defined(__native_client__)
|
||||
|
||||
#include "api/task_queue/task_queue_base.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/signal_thread.h"
|
||||
#include "rtc_base/task_queue.h"
|
||||
#include "rtc_base/task_utils/to_queued_task.h"
|
||||
#include "rtc_base/third_party/sigslot/sigslot.h" // for signal_with_thread...
|
||||
|
||||
namespace rtc {
|
||||
@ -83,18 +84,35 @@ int ResolveHostname(const std::string& hostname,
|
||||
#endif // !__native_client__
|
||||
}
|
||||
|
||||
// AsyncResolver
|
||||
AsyncResolver::AsyncResolver() : SignalThread(), error_(-1) {}
|
||||
AsyncResolver::AsyncResolver() : error_(-1) {}
|
||||
|
||||
AsyncResolver::~AsyncResolver() = default;
|
||||
AsyncResolver::~AsyncResolver() {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
}
|
||||
|
||||
void AsyncResolver::Start(const SocketAddress& addr) {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
RTC_DCHECK(!destroy_called_);
|
||||
addr_ = addr;
|
||||
// SignalThred Start will kickoff the resolve process.
|
||||
SignalThread::Start();
|
||||
webrtc::TaskQueueBase* current_task_queue = webrtc::TaskQueueBase::Current();
|
||||
popup_thread_ = Thread::Create();
|
||||
popup_thread_->Start();
|
||||
popup_thread_->PostTask(webrtc::ToQueuedTask(
|
||||
[this, flag = safety_.flag(), addr, current_task_queue] {
|
||||
std::vector<IPAddress> addresses;
|
||||
int error =
|
||||
ResolveHostname(addr.hostname().c_str(), addr.family(), &addresses);
|
||||
current_task_queue->PostTask(webrtc::ToQueuedTask(
|
||||
std::move(flag), [this, error, addresses = std::move(addresses)] {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
ResolveDone(std::move(addresses), error);
|
||||
}));
|
||||
}));
|
||||
}
|
||||
|
||||
bool AsyncResolver::GetResolvedAddress(int family, SocketAddress* addr) const {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
RTC_DCHECK(!destroy_called_);
|
||||
if (error_ != 0 || addresses_.empty())
|
||||
return false;
|
||||
|
||||
@ -109,20 +127,40 @@ bool AsyncResolver::GetResolvedAddress(int family, SocketAddress* addr) const {
|
||||
}
|
||||
|
||||
int AsyncResolver::GetError() const {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
RTC_DCHECK(!destroy_called_);
|
||||
return error_;
|
||||
}
|
||||
|
||||
void AsyncResolver::Destroy(bool wait) {
|
||||
SignalThread::Destroy(wait);
|
||||
// Some callers have trouble guaranteeing that Destroy is called on the
|
||||
// sequence guarded by |sequence_checker_|.
|
||||
// RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
RTC_DCHECK(!destroy_called_);
|
||||
destroy_called_ = true;
|
||||
MaybeSelfDestruct();
|
||||
}
|
||||
|
||||
void AsyncResolver::DoWork() {
|
||||
error_ =
|
||||
ResolveHostname(addr_.hostname().c_str(), addr_.family(), &addresses_);
|
||||
const std::vector<IPAddress>& AsyncResolver::addresses() const {
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
RTC_DCHECK(!destroy_called_);
|
||||
return addresses_;
|
||||
}
|
||||
|
||||
void AsyncResolver::OnWorkDone() {
|
||||
void AsyncResolver::ResolveDone(std::vector<IPAddress> addresses, int error) {
|
||||
addresses_ = addresses;
|
||||
error_ = error;
|
||||
recursion_check_ = true;
|
||||
SignalDone(this);
|
||||
MaybeSelfDestruct();
|
||||
}
|
||||
|
||||
void AsyncResolver::MaybeSelfDestruct() {
|
||||
if (!recursion_check_) {
|
||||
delete this;
|
||||
} else {
|
||||
recursion_check_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
const char* inet_ntop(int af, const void* src, char* dst, socklen_t size) {
|
||||
|
||||
Reference in New Issue
Block a user