Simplify PhysicalSocketServer
Merge OnPreEvent and OnEvent methods. Merge EventDispatcher class into Signaler class. Bug: None Change-Id: I3c07613c76a32a628926569aab0e1076e48a0a79 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/206983 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Taylor <deadbeef@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33262}
This commit is contained in:
parent
2afff37ba0
commit
21347458ad
@ -760,21 +760,14 @@ uint32_t SocketDispatcher::GetRequestedEvents() {
|
||||
return enabled_events();
|
||||
}
|
||||
|
||||
void SocketDispatcher::OnPreEvent(uint32_t ff) {
|
||||
if ((ff & DE_CONNECT) != 0)
|
||||
state_ = CS_CONNECTED;
|
||||
|
||||
#if defined(WEBRTC_WIN)
|
||||
// We set CS_CLOSED from CheckSignalClose.
|
||||
#elif defined(WEBRTC_POSIX)
|
||||
if ((ff & DE_CLOSE) != 0)
|
||||
state_ = CS_CLOSED;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(WEBRTC_WIN)
|
||||
|
||||
void SocketDispatcher::OnEvent(uint32_t ff, int err) {
|
||||
if ((ff & DE_CONNECT) != 0)
|
||||
state_ = CS_CONNECTED;
|
||||
|
||||
// We set CS_CLOSED from CheckSignalClose.
|
||||
|
||||
int cache_id = id_;
|
||||
// Make sure we deliver connect/accept first. Otherwise, consumers may see
|
||||
// something like a READ followed by a CONNECT, which would be odd.
|
||||
@ -809,6 +802,12 @@ void SocketDispatcher::OnEvent(uint32_t ff, int err) {
|
||||
#elif defined(WEBRTC_POSIX)
|
||||
|
||||
void SocketDispatcher::OnEvent(uint32_t ff, int err) {
|
||||
if ((ff & DE_CONNECT) != 0)
|
||||
state_ = CS_CONNECTED;
|
||||
|
||||
if ((ff & DE_CLOSE) != 0)
|
||||
state_ = CS_CLOSED;
|
||||
|
||||
#if defined(WEBRTC_USE_EPOLL)
|
||||
// Remember currently enabled events so we can combine multiple changes
|
||||
// into one update call later.
|
||||
@ -920,15 +919,25 @@ int SocketDispatcher::Close() {
|
||||
}
|
||||
|
||||
#if defined(WEBRTC_POSIX)
|
||||
class EventDispatcher : public Dispatcher {
|
||||
// Sets the value of a boolean value to false when signaled.
|
||||
class Signaler : public Dispatcher {
|
||||
public:
|
||||
EventDispatcher(PhysicalSocketServer* ss) : ss_(ss), fSignaled_(false) {
|
||||
if (pipe(afd_) < 0)
|
||||
RTC_LOG(LERROR) << "pipe failed";
|
||||
Signaler(PhysicalSocketServer* ss, bool& flag_to_clear)
|
||||
: ss_(ss),
|
||||
afd_([] {
|
||||
std::array<int, 2> afd = {-1, -1};
|
||||
|
||||
if (pipe(afd.data()) < 0) {
|
||||
RTC_LOG(LERROR) << "pipe failed";
|
||||
}
|
||||
return afd;
|
||||
}()),
|
||||
fSignaled_(false),
|
||||
flag_to_clear_(flag_to_clear) {
|
||||
ss_->Add(this);
|
||||
}
|
||||
|
||||
~EventDispatcher() override {
|
||||
~Signaler() override {
|
||||
ss_->Remove(this);
|
||||
close(afd_[0]);
|
||||
close(afd_[1]);
|
||||
@ -946,7 +955,7 @@ class EventDispatcher : public Dispatcher {
|
||||
|
||||
uint32_t GetRequestedEvents() override { return DE_READ; }
|
||||
|
||||
void OnPreEvent(uint32_t ff) override {
|
||||
void OnEvent(uint32_t ff, int err) override {
|
||||
// It is not possible to perfectly emulate an auto-resetting event with
|
||||
// pipes. This simulates it by resetting before the event is handled.
|
||||
|
||||
@ -957,19 +966,19 @@ class EventDispatcher : public Dispatcher {
|
||||
RTC_DCHECK_EQ(1, res);
|
||||
fSignaled_ = false;
|
||||
}
|
||||
flag_to_clear_ = false;
|
||||
}
|
||||
|
||||
void OnEvent(uint32_t ff, int err) override { RTC_NOTREACHED(); }
|
||||
|
||||
int GetDescriptor() override { return afd_[0]; }
|
||||
|
||||
bool IsDescriptorClosed() override { return false; }
|
||||
|
||||
private:
|
||||
PhysicalSocketServer* const ss_;
|
||||
int afd_[2]; // Assigned in constructor only.
|
||||
const std::array<int, 2> afd_;
|
||||
bool fSignaled_ RTC_GUARDED_BY(mutex_);
|
||||
webrtc::Mutex mutex_;
|
||||
bool& flag_to_clear_;
|
||||
};
|
||||
|
||||
#endif // WEBRTC_POSIX
|
||||
@ -988,16 +997,18 @@ static uint32_t FlagsToEvents(uint32_t events) {
|
||||
return ffFD;
|
||||
}
|
||||
|
||||
class EventDispatcher : public Dispatcher {
|
||||
// Sets the value of a boolean value to false when signaled.
|
||||
class Signaler : public Dispatcher {
|
||||
public:
|
||||
EventDispatcher(PhysicalSocketServer* ss) : ss_(ss) {
|
||||
Signaler(PhysicalSocketServer* ss, bool& flag_to_clear)
|
||||
: ss_(ss), flag_to_clear_(flag_to_clear) {
|
||||
hev_ = WSACreateEvent();
|
||||
if (hev_) {
|
||||
ss_->Add(this);
|
||||
}
|
||||
}
|
||||
|
||||
~EventDispatcher() override {
|
||||
~Signaler() override {
|
||||
if (hev_ != nullptr) {
|
||||
ss_->Remove(this);
|
||||
WSACloseEvent(hev_);
|
||||
@ -1012,9 +1023,10 @@ class EventDispatcher : public Dispatcher {
|
||||
|
||||
uint32_t GetRequestedEvents() override { return 0; }
|
||||
|
||||
void OnPreEvent(uint32_t ff) override { WSAResetEvent(hev_); }
|
||||
|
||||
void OnEvent(uint32_t ff, int err) override {}
|
||||
void OnEvent(uint32_t ff, int err) override {
|
||||
WSAResetEvent(hev_);
|
||||
flag_to_clear_ = false;
|
||||
}
|
||||
|
||||
WSAEVENT GetWSAEvent() override { return hev_; }
|
||||
|
||||
@ -1025,24 +1037,10 @@ class EventDispatcher : public Dispatcher {
|
||||
private:
|
||||
PhysicalSocketServer* ss_;
|
||||
WSAEVENT hev_;
|
||||
bool& flag_to_clear_;
|
||||
};
|
||||
#endif // WEBRTC_WIN
|
||||
|
||||
// Sets the value of a boolean value to false when signaled.
|
||||
class Signaler : public EventDispatcher {
|
||||
public:
|
||||
Signaler(PhysicalSocketServer* ss, bool* pf) : EventDispatcher(ss), pf_(pf) {}
|
||||
~Signaler() override {}
|
||||
|
||||
void OnEvent(uint32_t ff, int err) override {
|
||||
if (pf_)
|
||||
*pf_ = false;
|
||||
}
|
||||
|
||||
private:
|
||||
bool* pf_;
|
||||
};
|
||||
|
||||
PhysicalSocketServer::PhysicalSocketServer()
|
||||
:
|
||||
#if defined(WEBRTC_USE_EPOLL)
|
||||
@ -1062,7 +1060,8 @@ PhysicalSocketServer::PhysicalSocketServer()
|
||||
// Note that -1 == INVALID_SOCKET, the alias used by later checks.
|
||||
}
|
||||
#endif
|
||||
signal_wakeup_ = new Signaler(this, &fWait_);
|
||||
// The `fWait_` flag to be cleared by the Signaler.
|
||||
signal_wakeup_ = new Signaler(this, fWait_);
|
||||
}
|
||||
|
||||
PhysicalSocketServer::~PhysicalSocketServer() {
|
||||
@ -1230,7 +1229,6 @@ static void ProcessEvents(Dispatcher* dispatcher,
|
||||
|
||||
// Tell the descriptor about the event.
|
||||
if (ff != 0) {
|
||||
dispatcher->OnPreEvent(ff);
|
||||
dispatcher->OnEvent(ff, errcode);
|
||||
}
|
||||
}
|
||||
@ -1634,7 +1632,6 @@ bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) {
|
||||
continue;
|
||||
}
|
||||
Dispatcher* disp = dispatcher_by_key_.at(key);
|
||||
disp->OnPreEvent(0);
|
||||
disp->OnEvent(0, 0);
|
||||
} else if (process_io) {
|
||||
// Iterate only on the dispatchers whose sockets were passed into
|
||||
@ -1705,7 +1702,6 @@ bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) {
|
||||
errcode = wsaEvents.iErrorCode[FD_CLOSE_BIT];
|
||||
}
|
||||
if (ff != 0) {
|
||||
disp->OnPreEvent(ff);
|
||||
disp->OnEvent(ff, errcode);
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,7 +50,6 @@ class Dispatcher {
|
||||
public:
|
||||
virtual ~Dispatcher() {}
|
||||
virtual uint32_t GetRequestedEvents() = 0;
|
||||
virtual void OnPreEvent(uint32_t ff) = 0;
|
||||
virtual void OnEvent(uint32_t ff, int err) = 0;
|
||||
#if defined(WEBRTC_WIN)
|
||||
virtual WSAEVENT GetWSAEvent() = 0;
|
||||
@ -238,7 +237,6 @@ class SocketDispatcher : public Dispatcher, public PhysicalSocket {
|
||||
#endif
|
||||
|
||||
uint32_t GetRequestedEvents() override;
|
||||
void OnPreEvent(uint32_t ff) override;
|
||||
void OnEvent(uint32_t ff, int err) override;
|
||||
|
||||
int Close() override;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user