Chromium Code Reviews| Index: webrtc/base/nethelpers.cc |
| diff --git a/webrtc/base/nethelpers.cc b/webrtc/base/nethelpers.cc |
| index 6c11ef8c38fa04800df834bc8fa0f0f8939b3b89..037df428dbe44d183cd6c039fd6c128fad49618b 100644 |
| --- a/webrtc/base/nethelpers.cc |
| +++ b/webrtc/base/nethelpers.cc |
| @@ -25,13 +25,15 @@ |
| #endif |
| #endif // defined(WEBRTC_POSIX) && !defined(__native_client__) |
| +#include "webrtc/base/bind.h" |
| #include "webrtc/base/byteorder.h" |
| #include "webrtc/base/checks.h" |
| #include "webrtc/base/logging.h" |
| -#include "webrtc/base/signalthread.h" |
| +#include "webrtc/base/thread.h" |
| namespace rtc { |
| +namespace { |
| int ResolveHostname(const std::string& hostname, int family, |
| std::vector<IPAddress>* addresses) { |
| #ifdef __native_client__ |
| @@ -81,17 +83,23 @@ int ResolveHostname(const std::string& hostname, int family, |
| return 0; |
| #endif // !__native_client__ |
| } |
| +} // namespace |
| // AsyncResolver |
| AsyncResolver::AsyncResolver() |
| - : SignalThread(false /* use_socket_server */), error_(-1) {} |
| + : construction_thread_(Thread::Current()), |
| + worker_(&ThreadEntry_w, this, "AsyncResolver") {} |
| -AsyncResolver::~AsyncResolver() = default; |
| +AsyncResolver::~AsyncResolver() { |
| + RTC_DCHECK(construction_thread_->IsCurrent()); |
| + worker_.Stop(); |
| +} |
| void AsyncResolver::Start(const SocketAddress& addr) { |
| + RTC_DCHECK(construction_thread_->IsCurrent()); |
| + RTC_DCHECK(!worker_.IsRunning()); |
| addr_ = addr; |
| - // SignalThred Start will kickoff the resolve process. |
| - SignalThread::Start(); |
| + worker_.Start(); |
|
tommi
2017/06/15 10:20:32
implementing a custom QueuedTask that handles the
nisse-webrtc
2017/06/15 11:33:47
I'll give it a try.
|
| } |
| bool AsyncResolver::GetResolvedAddress(int family, SocketAddress* addr) const { |
| @@ -113,18 +121,37 @@ int AsyncResolver::GetError() const { |
| } |
| void AsyncResolver::Destroy(bool wait) { |
| - SignalThread::Destroy(wait); |
| + RTC_DCHECK(construction_thread_->IsCurrent()); |
| + // If we don't wait here, we will nevertheless wait in the destructor. |
| + if (wait) { |
|
tommi
2017/06/15 10:20:32
why is wait == false supported?
nisse-webrtc
2017/06/15 11:33:47
It's part of the AsyncResolverInterface, which I d
|
| + worker_.Stop(); |
| + } |
| } |
| -void AsyncResolver::DoWork() { |
| - error_ = ResolveHostname(addr_.hostname().c_str(), addr_.family(), |
| - &addresses_); |
| +void AsyncResolver::ResolveAddress_w() { |
| + RTC_DCHECK(IsThreadRefEqual(worker_.GetThreadRef(), CurrentThreadRef())); |
| + std::vector<IPAddress> addresses; |
| + int error = ResolveHostname(addr_.hostname().c_str(), addr_.family(), |
| + &addresses); |
| + // Ensure SignalDone is called on the main thread. |
| + construction_thread_->Invoke<void>( |
|
nisse-webrtc
2017/06/09 09:44:52
Actually, I don't think there's any need for this
Taylor Brandstetter
2017/06/09 18:02:58
Using an AsyncInvoker is the most convenient way I
|
| + RTC_FROM_HERE, rtc::Bind(&AsyncResolver::ResolveDone, this, |
| + error, addresses)); |
|
tommi
2017/06/15 10:20:32
std::move? (or will address be implicitly moved?)
nisse-webrtc
2017/06/15 11:33:47
Done.
|
| } |
| -void AsyncResolver::OnWorkDone() { |
| +void AsyncResolver::ResolveDone(int error, std::vector<IPAddress> addresses) { |
| + RTC_DCHECK(construction_thread_->IsCurrent()); |
| + error_ = error; |
| + addresses_ = addresses; |
|
tommi
2017/06/15 10:20:32
std::move
|
| SignalDone(this); |
| } |
| +// static |
| +void AsyncResolver::ThreadEntry_w(void* p) { |
|
tommi
2017/06/15 10:20:32
What about using a TaskQueue?
|
| + AsyncResolver* resolver = static_cast<AsyncResolver*>(p); |
| + resolver->ResolveAddress_w(); |
| +} |
| + |
| const char* inet_ntop(int af, const void *src, char* dst, socklen_t size) { |
| #if defined(WEBRTC_WIN) |
| return win32_inet_ntop(af, src, dst, size); |