Index: webrtc/base/physicalsocketserver.cc |
diff --git a/webrtc/base/physicalsocketserver.cc b/webrtc/base/physicalsocketserver.cc |
index 8e57d3bb5f765d231d3da61998562982feb244b8..a412703015e77f903b82c6126edd21a4c00a023d 100644 |
--- a/webrtc/base/physicalsocketserver.cc |
+++ b/webrtc/base/physicalsocketserver.cc |
@@ -121,7 +121,7 @@ static const int ICMP_PING_TIMEOUT_MILLIS = 10000u; |
#endif |
PhysicalSocket::PhysicalSocket(PhysicalSocketServer* ss, SOCKET s) |
- : ss_(ss), s_(s), enabled_events_(0), error_(0), |
+ : ss_(ss), s_(s), error_(0), |
state_((s == INVALID_SOCKET) ? CS_CLOSED : CS_CONNECTED), |
resolver_(nullptr) { |
#if defined(WEBRTC_WIN) |
@@ -133,7 +133,7 @@ PhysicalSocket::PhysicalSocket(PhysicalSocketServer* ss, SOCKET s) |
EnsureWinsockInit(); |
#endif |
if (s_ != INVALID_SOCKET) { |
- enabled_events_ = DE_READ | DE_WRITE; |
+ SetEnabledEvents(DE_READ | DE_WRITE); |
int type = SOCK_STREAM; |
socklen_t len = sizeof(type); |
@@ -153,8 +153,9 @@ bool PhysicalSocket::Create(int family, int type) { |
s_ = ::socket(family, type, 0); |
udp_ = (SOCK_DGRAM == type); |
UpdateLastError(); |
- if (udp_) |
- enabled_events_ = DE_READ | DE_WRITE; |
+ if (udp_) { |
+ SetEnabledEvents(DE_READ | DE_WRITE); |
+ } |
return s_ != INVALID_SOCKET; |
} |
@@ -266,16 +267,17 @@ int PhysicalSocket::DoConnect(const SocketAddress& connect_addr) { |
sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
int err = ::connect(s_, addr, static_cast<int>(len)); |
UpdateLastError(); |
+ uint8_t events = DE_READ | DE_WRITE; |
if (err == 0) { |
state_ = CS_CONNECTED; |
} else if (IsBlockingError(GetError())) { |
state_ = CS_CONNECTING; |
- enabled_events_ |= DE_CONNECT; |
+ events |= DE_CONNECT; |
} else { |
return SOCKET_ERROR; |
} |
- enabled_events_ |= DE_READ | DE_WRITE; |
+ EnableEvents(events); |
return 0; |
} |
@@ -341,7 +343,7 @@ int PhysicalSocket::Send(const void* pv, size_t cb) { |
RTC_DCHECK(sent <= static_cast<int>(cb)); |
if ((sent > 0 && sent < static_cast<int>(cb)) || |
(sent < 0 && IsBlockingError(GetError()))) { |
- enabled_events_ |= DE_WRITE; |
+ EnableEvents(DE_WRITE); |
} |
return sent; |
} |
@@ -366,7 +368,7 @@ int PhysicalSocket::SendTo(const void* buffer, |
RTC_DCHECK(sent <= static_cast<int>(length)); |
if ((sent > 0 && sent < static_cast<int>(length)) || |
(sent < 0 && IsBlockingError(GetError()))) { |
- enabled_events_ |= DE_WRITE; |
+ EnableEvents(DE_WRITE); |
} |
return sent; |
} |
@@ -381,7 +383,7 @@ int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { |
LOG(LS_WARNING) << "EOF from socket; deferring close event"; |
// Must turn this back on so that the select() loop will notice the close |
// event. |
- enabled_events_ |= DE_READ; |
+ EnableEvents(DE_READ); |
SetError(EWOULDBLOCK); |
return SOCKET_ERROR; |
} |
@@ -392,7 +394,7 @@ int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { |
int error = GetError(); |
bool success = (received >= 0) || IsBlockingError(error); |
if (udp_ || success) { |
- enabled_events_ |= DE_READ; |
+ EnableEvents(DE_READ); |
} |
if (!success) { |
LOG_F(LS_VERBOSE) << "Error = " << error; |
@@ -418,7 +420,7 @@ int PhysicalSocket::RecvFrom(void* buffer, |
int error = GetError(); |
bool success = (received >= 0) || IsBlockingError(error); |
if (udp_ || success) { |
- enabled_events_ |= DE_READ; |
+ EnableEvents(DE_READ); |
} |
if (!success) { |
LOG_F(LS_VERBOSE) << "Error = " << error; |
@@ -431,7 +433,7 @@ int PhysicalSocket::Listen(int backlog) { |
UpdateLastError(); |
if (err == 0) { |
state_ = CS_CONNECTING; |
- enabled_events_ |= DE_ACCEPT; |
+ EnableEvents(DE_ACCEPT); |
#if !defined(NDEBUG) |
dbg_addr_ = "Listening @ "; |
dbg_addr_.append(GetLocalAddress().ToString()); |
@@ -443,7 +445,7 @@ int PhysicalSocket::Listen(int backlog) { |
AsyncSocket* PhysicalSocket::Accept(SocketAddress* out_addr) { |
// Always re-subscribe DE_ACCEPT to make sure new incoming connections will |
// trigger an event even if DoAccept returns an error here. |
- enabled_events_ |= DE_ACCEPT; |
+ EnableEvents(DE_ACCEPT); |
sockaddr_storage addr_storage; |
socklen_t addr_len = sizeof(addr_storage); |
sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
@@ -463,7 +465,7 @@ int PhysicalSocket::Close() { |
UpdateLastError(); |
s_ = INVALID_SOCKET; |
state_ = CS_CLOSED; |
- enabled_events_ = 0; |
+ SetEnabledEvents(0); |
if (resolver_) { |
resolver_->Destroy(false); |
resolver_ = nullptr; |
@@ -525,6 +527,18 @@ void PhysicalSocket::MaybeRemapSendError() { |
#endif |
} |
+void PhysicalSocket::SetEnabledEvents(uint8_t events) { |
+ enabled_events_ = events; |
+} |
+ |
+void PhysicalSocket::EnableEvents(uint8_t events) { |
+ enabled_events_ |= events; |
+} |
+ |
+void PhysicalSocket::DisableEvents(uint8_t events) { |
+ enabled_events_ &= ~events; |
+} |
+ |
int PhysicalSocket::TranslateOption(Option opt, int* slevel, int* sopt) { |
switch (opt) { |
case OPT_DONTFRAGMENT: |
@@ -699,7 +713,7 @@ bool SocketDispatcher::IsDescriptorClosed() { |
#endif // WEBRTC_POSIX |
uint32_t SocketDispatcher::GetRequestedEvents() { |
- return enabled_events_; |
+ return enabled_events(); |
} |
void SocketDispatcher::OnPreEvent(uint32_t ff) { |
@@ -723,7 +737,7 @@ void SocketDispatcher::OnEvent(uint32_t ff, int err) { |
if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) { |
if (ff != DE_CONNECT) |
LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff; |
- enabled_events_ &= ~DE_CONNECT; |
+ DisableEvents(DE_CONNECT); |
#if !defined(NDEBUG) |
dbg_addr_ = "Connected @ "; |
dbg_addr_.append(GetRemoteAddress().ToString()); |
@@ -731,15 +745,15 @@ void SocketDispatcher::OnEvent(uint32_t ff, int err) { |
SignalConnectEvent(this); |
} |
if (((ff & DE_ACCEPT) != 0) && (id_ == cache_id)) { |
- enabled_events_ &= ~DE_ACCEPT; |
+ DisableEvents(DE_ACCEPT); |
SignalReadEvent(this); |
} |
if ((ff & DE_READ) != 0) { |
- enabled_events_ &= ~DE_READ; |
+ DisableEvents(DE_READ); |
SignalReadEvent(this); |
} |
if (((ff & DE_WRITE) != 0) && (id_ == cache_id)) { |
- enabled_events_ &= ~DE_WRITE; |
+ DisableEvents(DE_WRITE); |
SignalWriteEvent(this); |
} |
if (((ff & DE_CLOSE) != 0) && (id_ == cache_id)) { |
@@ -754,24 +768,24 @@ void SocketDispatcher::OnEvent(uint32_t ff, int err) { |
// Make sure we deliver connect/accept first. Otherwise, consumers may see |
// something like a READ followed by a CONNECT, which would be odd. |
if ((ff & DE_CONNECT) != 0) { |
- enabled_events_ &= ~DE_CONNECT; |
+ DisableEvents(DE_CONNECT); |
SignalConnectEvent(this); |
} |
if ((ff & DE_ACCEPT) != 0) { |
- enabled_events_ &= ~DE_ACCEPT; |
+ DisableEvents(DE_ACCEPT); |
SignalReadEvent(this); |
} |
if ((ff & DE_READ) != 0) { |
- enabled_events_ &= ~DE_READ; |
+ DisableEvents(DE_READ); |
SignalReadEvent(this); |
} |
if ((ff & DE_WRITE) != 0) { |
- enabled_events_ &= ~DE_WRITE; |
+ DisableEvents(DE_WRITE); |
SignalWriteEvent(this); |
} |
if ((ff & DE_CLOSE) != 0) { |
// The socket is now dead to us, so stop checking it. |
- enabled_events_ = 0; |
+ SetEnabledEvents(0); |
SignalCloseEvent(this, err); |
} |
} |