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
@ -21,16 +21,23 @@
|
||||
|
||||
#include "rtc_base/async_resolver_interface.h"
|
||||
#include "rtc_base/ip_address.h"
|
||||
#include "rtc_base/signal_thread.h"
|
||||
#include "rtc_base/socket_address.h"
|
||||
#include "rtc_base/synchronization/sequence_checker.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
#include "rtc_base/task_utils/pending_task_safety_flag.h"
|
||||
#include "rtc_base/thread.h"
|
||||
#include "rtc_base/thread_annotations.h"
|
||||
|
||||
namespace rtc {
|
||||
|
||||
// AsyncResolver will perform async DNS resolution, signaling the result on
|
||||
// the SignalDone from AsyncResolverInterface when the operation completes.
|
||||
class RTC_EXPORT AsyncResolver : public SignalThread,
|
||||
public AsyncResolverInterface {
|
||||
//
|
||||
// This class is thread-compatible, and all methods and destruction needs to
|
||||
// happen from the same rtc::Thread, except for Destroy which is allowed to
|
||||
// happen on another context provided it's not happening concurrently to another
|
||||
// public API call, and is the last access to the object.
|
||||
class RTC_EXPORT AsyncResolver : public AsyncResolverInterface {
|
||||
public:
|
||||
AsyncResolver();
|
||||
~AsyncResolver() override;
|
||||
@ -40,17 +47,22 @@ class RTC_EXPORT AsyncResolver : public SignalThread,
|
||||
int GetError() const override;
|
||||
void Destroy(bool wait) override;
|
||||
|
||||
const std::vector<IPAddress>& addresses() const { return addresses_; }
|
||||
void set_error(int error) { error_ = error; }
|
||||
|
||||
protected:
|
||||
void DoWork() override;
|
||||
void OnWorkDone() override;
|
||||
const std::vector<IPAddress>& addresses() const;
|
||||
|
||||
private:
|
||||
SocketAddress addr_;
|
||||
std::vector<IPAddress> addresses_;
|
||||
int error_;
|
||||
void ResolveDone(std::vector<IPAddress> addresses, int error)
|
||||
RTC_EXCLUSIVE_LOCKS_REQUIRED(sequence_checker_);
|
||||
void MaybeSelfDestruct();
|
||||
|
||||
SocketAddress addr_ RTC_GUARDED_BY(sequence_checker_);
|
||||
std::vector<IPAddress> addresses_ RTC_GUARDED_BY(sequence_checker_);
|
||||
int error_ RTC_GUARDED_BY(sequence_checker_);
|
||||
webrtc::ScopedTaskSafety safety_ RTC_GUARDED_BY(sequence_checker_);
|
||||
std::unique_ptr<Thread> popup_thread_ RTC_GUARDED_BY(sequence_checker_);
|
||||
bool recursion_check_ =
|
||||
false; // Protects against SignalDone calling into Destroy.
|
||||
bool destroy_called_ = false;
|
||||
webrtc::SequenceChecker sequence_checker_;
|
||||
};
|
||||
|
||||
// rtc namespaced wrappers for inet_ntop and inet_pton so we can avoid
|
||||
|
||||
Reference in New Issue
Block a user