| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 #include "webrtc/base/physicalsocketserver.h" | 10 #include "webrtc/base/physicalsocketserver.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 0, // End of list marker | 114 0, // End of list marker |
| 115 }; | 115 }; |
| 116 | 116 |
| 117 static const int IP_HEADER_SIZE = 20u; | 117 static const int IP_HEADER_SIZE = 20u; |
| 118 static const int IPV6_HEADER_SIZE = 40u; | 118 static const int IPV6_HEADER_SIZE = 40u; |
| 119 static const int ICMP_HEADER_SIZE = 8u; | 119 static const int ICMP_HEADER_SIZE = 8u; |
| 120 static const int ICMP_PING_TIMEOUT_MILLIS = 10000u; | 120 static const int ICMP_PING_TIMEOUT_MILLIS = 10000u; |
| 121 #endif | 121 #endif |
| 122 | 122 |
| 123 PhysicalSocket::PhysicalSocket(PhysicalSocketServer* ss, SOCKET s) | 123 PhysicalSocket::PhysicalSocket(PhysicalSocketServer* ss, SOCKET s) |
| 124 : ss_(ss), s_(s), enabled_events_(0), error_(0), | 124 : ss_(ss), s_(s), error_(0), |
| 125 state_((s == INVALID_SOCKET) ? CS_CLOSED : CS_CONNECTED), | 125 state_((s == INVALID_SOCKET) ? CS_CLOSED : CS_CONNECTED), |
| 126 resolver_(nullptr) { | 126 resolver_(nullptr) { |
| 127 #if defined(WEBRTC_WIN) | 127 #if defined(WEBRTC_WIN) |
| 128 // EnsureWinsockInit() ensures that winsock is initialized. The default | 128 // EnsureWinsockInit() ensures that winsock is initialized. The default |
| 129 // version of this function doesn't do anything because winsock is | 129 // version of this function doesn't do anything because winsock is |
| 130 // initialized by constructor of a static object. If neccessary libjingle | 130 // initialized by constructor of a static object. If neccessary libjingle |
| 131 // users can link it with a different version of this function by replacing | 131 // users can link it with a different version of this function by replacing |
| 132 // win32socketinit.cc. See win32socketinit.cc for more details. | 132 // win32socketinit.cc. See win32socketinit.cc for more details. |
| 133 EnsureWinsockInit(); | 133 EnsureWinsockInit(); |
| 134 #endif | 134 #endif |
| 135 if (s_ != INVALID_SOCKET) { | 135 if (s_ != INVALID_SOCKET) { |
| 136 enabled_events_ = DE_READ | DE_WRITE; | 136 SetEnabledEvents(DE_READ | DE_WRITE); |
| 137 | 137 |
| 138 int type = SOCK_STREAM; | 138 int type = SOCK_STREAM; |
| 139 socklen_t len = sizeof(type); | 139 socklen_t len = sizeof(type); |
| 140 const int res = | 140 const int res = |
| 141 getsockopt(s_, SOL_SOCKET, SO_TYPE, (SockOptArg)&type, &len); | 141 getsockopt(s_, SOL_SOCKET, SO_TYPE, (SockOptArg)&type, &len); |
| 142 RTC_DCHECK_EQ(0, res); | 142 RTC_DCHECK_EQ(0, res); |
| 143 udp_ = (SOCK_DGRAM == type); | 143 udp_ = (SOCK_DGRAM == type); |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 PhysicalSocket::~PhysicalSocket() { | 147 PhysicalSocket::~PhysicalSocket() { |
| 148 Close(); | 148 Close(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 bool PhysicalSocket::Create(int family, int type) { | 151 bool PhysicalSocket::Create(int family, int type) { |
| 152 Close(); | 152 Close(); |
| 153 s_ = ::socket(family, type, 0); | 153 s_ = ::socket(family, type, 0); |
| 154 udp_ = (SOCK_DGRAM == type); | 154 udp_ = (SOCK_DGRAM == type); |
| 155 UpdateLastError(); | 155 UpdateLastError(); |
| 156 if (udp_) | 156 if (udp_) { |
| 157 enabled_events_ = DE_READ | DE_WRITE; | 157 SetEnabledEvents(DE_READ | DE_WRITE); |
| 158 } |
| 158 return s_ != INVALID_SOCKET; | 159 return s_ != INVALID_SOCKET; |
| 159 } | 160 } |
| 160 | 161 |
| 161 SocketAddress PhysicalSocket::GetLocalAddress() const { | 162 SocketAddress PhysicalSocket::GetLocalAddress() const { |
| 162 sockaddr_storage addr_storage = {0}; | 163 sockaddr_storage addr_storage = {0}; |
| 163 socklen_t addrlen = sizeof(addr_storage); | 164 socklen_t addrlen = sizeof(addr_storage); |
| 164 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); | 165 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
| 165 int result = ::getsockname(s_, addr, &addrlen); | 166 int result = ::getsockname(s_, addr, &addrlen); |
| 166 SocketAddress address; | 167 SocketAddress address; |
| 167 if (result >= 0) { | 168 if (result >= 0) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 259 int PhysicalSocket::DoConnect(const SocketAddress& connect_addr) { | 260 int PhysicalSocket::DoConnect(const SocketAddress& connect_addr) { |
| 260 if ((s_ == INVALID_SOCKET) && | 261 if ((s_ == INVALID_SOCKET) && |
| 261 !Create(connect_addr.family(), SOCK_STREAM)) { | 262 !Create(connect_addr.family(), SOCK_STREAM)) { |
| 262 return SOCKET_ERROR; | 263 return SOCKET_ERROR; |
| 263 } | 264 } |
| 264 sockaddr_storage addr_storage; | 265 sockaddr_storage addr_storage; |
| 265 size_t len = connect_addr.ToSockAddrStorage(&addr_storage); | 266 size_t len = connect_addr.ToSockAddrStorage(&addr_storage); |
| 266 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); | 267 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
| 267 int err = ::connect(s_, addr, static_cast<int>(len)); | 268 int err = ::connect(s_, addr, static_cast<int>(len)); |
| 268 UpdateLastError(); | 269 UpdateLastError(); |
| 270 uint8_t events = DE_READ | DE_WRITE; |
| 269 if (err == 0) { | 271 if (err == 0) { |
| 270 state_ = CS_CONNECTED; | 272 state_ = CS_CONNECTED; |
| 271 } else if (IsBlockingError(GetError())) { | 273 } else if (IsBlockingError(GetError())) { |
| 272 state_ = CS_CONNECTING; | 274 state_ = CS_CONNECTING; |
| 273 enabled_events_ |= DE_CONNECT; | 275 events |= DE_CONNECT; |
| 274 } else { | 276 } else { |
| 275 return SOCKET_ERROR; | 277 return SOCKET_ERROR; |
| 276 } | 278 } |
| 277 | 279 |
| 278 enabled_events_ |= DE_READ | DE_WRITE; | 280 EnableEvents(events); |
| 279 return 0; | 281 return 0; |
| 280 } | 282 } |
| 281 | 283 |
| 282 int PhysicalSocket::GetError() const { | 284 int PhysicalSocket::GetError() const { |
| 283 CritScope cs(&crit_); | 285 CritScope cs(&crit_); |
| 284 return error_; | 286 return error_; |
| 285 } | 287 } |
| 286 | 288 |
| 287 void PhysicalSocket::SetError(int error) { | 289 void PhysicalSocket::SetError(int error) { |
| 288 CritScope cs(&crit_); | 290 CritScope cs(&crit_); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 #else | 336 #else |
| 335 0 | 337 0 |
| 336 #endif | 338 #endif |
| 337 ); | 339 ); |
| 338 UpdateLastError(); | 340 UpdateLastError(); |
| 339 MaybeRemapSendError(); | 341 MaybeRemapSendError(); |
| 340 // We have seen minidumps where this may be false. | 342 // We have seen minidumps where this may be false. |
| 341 RTC_DCHECK(sent <= static_cast<int>(cb)); | 343 RTC_DCHECK(sent <= static_cast<int>(cb)); |
| 342 if ((sent > 0 && sent < static_cast<int>(cb)) || | 344 if ((sent > 0 && sent < static_cast<int>(cb)) || |
| 343 (sent < 0 && IsBlockingError(GetError()))) { | 345 (sent < 0 && IsBlockingError(GetError()))) { |
| 344 enabled_events_ |= DE_WRITE; | 346 EnableEvents(DE_WRITE); |
| 345 } | 347 } |
| 346 return sent; | 348 return sent; |
| 347 } | 349 } |
| 348 | 350 |
| 349 int PhysicalSocket::SendTo(const void* buffer, | 351 int PhysicalSocket::SendTo(const void* buffer, |
| 350 size_t length, | 352 size_t length, |
| 351 const SocketAddress& addr) { | 353 const SocketAddress& addr) { |
| 352 sockaddr_storage saddr; | 354 sockaddr_storage saddr; |
| 353 size_t len = addr.ToSockAddrStorage(&saddr); | 355 size_t len = addr.ToSockAddrStorage(&saddr); |
| 354 int sent = DoSendTo( | 356 int sent = DoSendTo( |
| 355 s_, static_cast<const char *>(buffer), static_cast<int>(length), | 357 s_, static_cast<const char *>(buffer), static_cast<int>(length), |
| 356 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 358 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
| 357 // Suppress SIGPIPE. See above for explanation. | 359 // Suppress SIGPIPE. See above for explanation. |
| 358 MSG_NOSIGNAL, | 360 MSG_NOSIGNAL, |
| 359 #else | 361 #else |
| 360 0, | 362 0, |
| 361 #endif | 363 #endif |
| 362 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); | 364 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); |
| 363 UpdateLastError(); | 365 UpdateLastError(); |
| 364 MaybeRemapSendError(); | 366 MaybeRemapSendError(); |
| 365 // We have seen minidumps where this may be false. | 367 // We have seen minidumps where this may be false. |
| 366 RTC_DCHECK(sent <= static_cast<int>(length)); | 368 RTC_DCHECK(sent <= static_cast<int>(length)); |
| 367 if ((sent > 0 && sent < static_cast<int>(length)) || | 369 if ((sent > 0 && sent < static_cast<int>(length)) || |
| 368 (sent < 0 && IsBlockingError(GetError()))) { | 370 (sent < 0 && IsBlockingError(GetError()))) { |
| 369 enabled_events_ |= DE_WRITE; | 371 EnableEvents(DE_WRITE); |
| 370 } | 372 } |
| 371 return sent; | 373 return sent; |
| 372 } | 374 } |
| 373 | 375 |
| 374 int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { | 376 int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { |
| 375 int received = ::recv(s_, static_cast<char*>(buffer), | 377 int received = ::recv(s_, static_cast<char*>(buffer), |
| 376 static_cast<int>(length), 0); | 378 static_cast<int>(length), 0); |
| 377 if ((received == 0) && (length != 0)) { | 379 if ((received == 0) && (length != 0)) { |
| 378 // Note: on graceful shutdown, recv can return 0. In this case, we | 380 // Note: on graceful shutdown, recv can return 0. In this case, we |
| 379 // pretend it is blocking, and then signal close, so that simplifying | 381 // pretend it is blocking, and then signal close, so that simplifying |
| 380 // assumptions can be made about Recv. | 382 // assumptions can be made about Recv. |
| 381 LOG(LS_WARNING) << "EOF from socket; deferring close event"; | 383 LOG(LS_WARNING) << "EOF from socket; deferring close event"; |
| 382 // Must turn this back on so that the select() loop will notice the close | 384 // Must turn this back on so that the select() loop will notice the close |
| 383 // event. | 385 // event. |
| 384 enabled_events_ |= DE_READ; | 386 EnableEvents(DE_READ); |
| 385 SetError(EWOULDBLOCK); | 387 SetError(EWOULDBLOCK); |
| 386 return SOCKET_ERROR; | 388 return SOCKET_ERROR; |
| 387 } | 389 } |
| 388 if (timestamp) { | 390 if (timestamp) { |
| 389 *timestamp = GetSocketRecvTimestamp(s_); | 391 *timestamp = GetSocketRecvTimestamp(s_); |
| 390 } | 392 } |
| 391 UpdateLastError(); | 393 UpdateLastError(); |
| 392 int error = GetError(); | 394 int error = GetError(); |
| 393 bool success = (received >= 0) || IsBlockingError(error); | 395 bool success = (received >= 0) || IsBlockingError(error); |
| 394 if (udp_ || success) { | 396 if (udp_ || success) { |
| 395 enabled_events_ |= DE_READ; | 397 EnableEvents(DE_READ); |
| 396 } | 398 } |
| 397 if (!success) { | 399 if (!success) { |
| 398 LOG_F(LS_VERBOSE) << "Error = " << error; | 400 LOG_F(LS_VERBOSE) << "Error = " << error; |
| 399 } | 401 } |
| 400 return received; | 402 return received; |
| 401 } | 403 } |
| 402 | 404 |
| 403 int PhysicalSocket::RecvFrom(void* buffer, | 405 int PhysicalSocket::RecvFrom(void* buffer, |
| 404 size_t length, | 406 size_t length, |
| 405 SocketAddress* out_addr, | 407 SocketAddress* out_addr, |
| 406 int64_t* timestamp) { | 408 int64_t* timestamp) { |
| 407 sockaddr_storage addr_storage; | 409 sockaddr_storage addr_storage; |
| 408 socklen_t addr_len = sizeof(addr_storage); | 410 socklen_t addr_len = sizeof(addr_storage); |
| 409 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); | 411 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
| 410 int received = ::recvfrom(s_, static_cast<char*>(buffer), | 412 int received = ::recvfrom(s_, static_cast<char*>(buffer), |
| 411 static_cast<int>(length), 0, addr, &addr_len); | 413 static_cast<int>(length), 0, addr, &addr_len); |
| 412 if (timestamp) { | 414 if (timestamp) { |
| 413 *timestamp = GetSocketRecvTimestamp(s_); | 415 *timestamp = GetSocketRecvTimestamp(s_); |
| 414 } | 416 } |
| 415 UpdateLastError(); | 417 UpdateLastError(); |
| 416 if ((received >= 0) && (out_addr != nullptr)) | 418 if ((received >= 0) && (out_addr != nullptr)) |
| 417 SocketAddressFromSockAddrStorage(addr_storage, out_addr); | 419 SocketAddressFromSockAddrStorage(addr_storage, out_addr); |
| 418 int error = GetError(); | 420 int error = GetError(); |
| 419 bool success = (received >= 0) || IsBlockingError(error); | 421 bool success = (received >= 0) || IsBlockingError(error); |
| 420 if (udp_ || success) { | 422 if (udp_ || success) { |
| 421 enabled_events_ |= DE_READ; | 423 EnableEvents(DE_READ); |
| 422 } | 424 } |
| 423 if (!success) { | 425 if (!success) { |
| 424 LOG_F(LS_VERBOSE) << "Error = " << error; | 426 LOG_F(LS_VERBOSE) << "Error = " << error; |
| 425 } | 427 } |
| 426 return received; | 428 return received; |
| 427 } | 429 } |
| 428 | 430 |
| 429 int PhysicalSocket::Listen(int backlog) { | 431 int PhysicalSocket::Listen(int backlog) { |
| 430 int err = ::listen(s_, backlog); | 432 int err = ::listen(s_, backlog); |
| 431 UpdateLastError(); | 433 UpdateLastError(); |
| 432 if (err == 0) { | 434 if (err == 0) { |
| 433 state_ = CS_CONNECTING; | 435 state_ = CS_CONNECTING; |
| 434 enabled_events_ |= DE_ACCEPT; | 436 EnableEvents(DE_ACCEPT); |
| 435 #if !defined(NDEBUG) | 437 #if !defined(NDEBUG) |
| 436 dbg_addr_ = "Listening @ "; | 438 dbg_addr_ = "Listening @ "; |
| 437 dbg_addr_.append(GetLocalAddress().ToString()); | 439 dbg_addr_.append(GetLocalAddress().ToString()); |
| 438 #endif | 440 #endif |
| 439 } | 441 } |
| 440 return err; | 442 return err; |
| 441 } | 443 } |
| 442 | 444 |
| 443 AsyncSocket* PhysicalSocket::Accept(SocketAddress* out_addr) { | 445 AsyncSocket* PhysicalSocket::Accept(SocketAddress* out_addr) { |
| 444 // Always re-subscribe DE_ACCEPT to make sure new incoming connections will | 446 // Always re-subscribe DE_ACCEPT to make sure new incoming connections will |
| 445 // trigger an event even if DoAccept returns an error here. | 447 // trigger an event even if DoAccept returns an error here. |
| 446 enabled_events_ |= DE_ACCEPT; | 448 EnableEvents(DE_ACCEPT); |
| 447 sockaddr_storage addr_storage; | 449 sockaddr_storage addr_storage; |
| 448 socklen_t addr_len = sizeof(addr_storage); | 450 socklen_t addr_len = sizeof(addr_storage); |
| 449 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); | 451 sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage); |
| 450 SOCKET s = DoAccept(s_, addr, &addr_len); | 452 SOCKET s = DoAccept(s_, addr, &addr_len); |
| 451 UpdateLastError(); | 453 UpdateLastError(); |
| 452 if (s == INVALID_SOCKET) | 454 if (s == INVALID_SOCKET) |
| 453 return nullptr; | 455 return nullptr; |
| 454 if (out_addr != nullptr) | 456 if (out_addr != nullptr) |
| 455 SocketAddressFromSockAddrStorage(addr_storage, out_addr); | 457 SocketAddressFromSockAddrStorage(addr_storage, out_addr); |
| 456 return ss_->WrapSocket(s); | 458 return ss_->WrapSocket(s); |
| 457 } | 459 } |
| 458 | 460 |
| 459 int PhysicalSocket::Close() { | 461 int PhysicalSocket::Close() { |
| 460 if (s_ == INVALID_SOCKET) | 462 if (s_ == INVALID_SOCKET) |
| 461 return 0; | 463 return 0; |
| 462 int err = ::closesocket(s_); | 464 int err = ::closesocket(s_); |
| 463 UpdateLastError(); | 465 UpdateLastError(); |
| 464 s_ = INVALID_SOCKET; | 466 s_ = INVALID_SOCKET; |
| 465 state_ = CS_CLOSED; | 467 state_ = CS_CLOSED; |
| 466 enabled_events_ = 0; | 468 SetEnabledEvents(0); |
| 467 if (resolver_) { | 469 if (resolver_) { |
| 468 resolver_->Destroy(false); | 470 resolver_->Destroy(false); |
| 469 resolver_ = nullptr; | 471 resolver_ = nullptr; |
| 470 } | 472 } |
| 471 return err; | 473 return err; |
| 472 } | 474 } |
| 473 | 475 |
| 474 SOCKET PhysicalSocket::DoAccept(SOCKET socket, | 476 SOCKET PhysicalSocket::DoAccept(SOCKET socket, |
| 475 sockaddr* addr, | 477 sockaddr* addr, |
| 476 socklen_t* addrlen) { | 478 socklen_t* addrlen) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 // Reference/ManPages/man2/sendto.2.html | 520 // Reference/ManPages/man2/sendto.2.html |
| 519 // ENOBUFS - The output queue for a network interface is full. | 521 // ENOBUFS - The output queue for a network interface is full. |
| 520 // This generally indicates that the interface has stopped sending, | 522 // This generally indicates that the interface has stopped sending, |
| 521 // but may be caused by transient congestion. | 523 // but may be caused by transient congestion. |
| 522 if (GetError() == ENOBUFS) { | 524 if (GetError() == ENOBUFS) { |
| 523 SetError(EWOULDBLOCK); | 525 SetError(EWOULDBLOCK); |
| 524 } | 526 } |
| 525 #endif | 527 #endif |
| 526 } | 528 } |
| 527 | 529 |
| 530 void PhysicalSocket::SetEnabledEvents(uint8_t events) { |
| 531 enabled_events_ = events; |
| 532 } |
| 533 |
| 534 void PhysicalSocket::EnableEvents(uint8_t events) { |
| 535 enabled_events_ |= events; |
| 536 } |
| 537 |
| 538 void PhysicalSocket::DisableEvents(uint8_t events) { |
| 539 enabled_events_ &= ~events; |
| 540 } |
| 541 |
| 528 int PhysicalSocket::TranslateOption(Option opt, int* slevel, int* sopt) { | 542 int PhysicalSocket::TranslateOption(Option opt, int* slevel, int* sopt) { |
| 529 switch (opt) { | 543 switch (opt) { |
| 530 case OPT_DONTFRAGMENT: | 544 case OPT_DONTFRAGMENT: |
| 531 #if defined(WEBRTC_WIN) | 545 #if defined(WEBRTC_WIN) |
| 532 *slevel = IPPROTO_IP; | 546 *slevel = IPPROTO_IP; |
| 533 *sopt = IP_DONTFRAGMENT; | 547 *sopt = IP_DONTFRAGMENT; |
| 534 break; | 548 break; |
| 535 #elif defined(WEBRTC_MAC) || defined(BSD) || defined(__native_client__) | 549 #elif defined(WEBRTC_MAC) || defined(BSD) || defined(__native_client__) |
| 536 LOG(LS_WARNING) << "Socket::OPT_DONTFRAGMENT not supported."; | 550 LOG(LS_WARNING) << "Socket::OPT_DONTFRAGMENT not supported."; |
| 537 return -1; | 551 return -1; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 // the socket is closed. | 706 // the socket is closed. |
| 693 LOG_ERR(LS_WARNING) << "Assuming benign blocking error"; | 707 LOG_ERR(LS_WARNING) << "Assuming benign blocking error"; |
| 694 return false; | 708 return false; |
| 695 } | 709 } |
| 696 } | 710 } |
| 697 } | 711 } |
| 698 | 712 |
| 699 #endif // WEBRTC_POSIX | 713 #endif // WEBRTC_POSIX |
| 700 | 714 |
| 701 uint32_t SocketDispatcher::GetRequestedEvents() { | 715 uint32_t SocketDispatcher::GetRequestedEvents() { |
| 702 return enabled_events_; | 716 return enabled_events(); |
| 703 } | 717 } |
| 704 | 718 |
| 705 void SocketDispatcher::OnPreEvent(uint32_t ff) { | 719 void SocketDispatcher::OnPreEvent(uint32_t ff) { |
| 706 if ((ff & DE_CONNECT) != 0) | 720 if ((ff & DE_CONNECT) != 0) |
| 707 state_ = CS_CONNECTED; | 721 state_ = CS_CONNECTED; |
| 708 | 722 |
| 709 #if defined(WEBRTC_WIN) | 723 #if defined(WEBRTC_WIN) |
| 710 // We set CS_CLOSED from CheckSignalClose. | 724 // We set CS_CLOSED from CheckSignalClose. |
| 711 #elif defined(WEBRTC_POSIX) | 725 #elif defined(WEBRTC_POSIX) |
| 712 if ((ff & DE_CLOSE) != 0) | 726 if ((ff & DE_CLOSE) != 0) |
| 713 state_ = CS_CLOSED; | 727 state_ = CS_CLOSED; |
| 714 #endif | 728 #endif |
| 715 } | 729 } |
| 716 | 730 |
| 717 #if defined(WEBRTC_WIN) | 731 #if defined(WEBRTC_WIN) |
| 718 | 732 |
| 719 void SocketDispatcher::OnEvent(uint32_t ff, int err) { | 733 void SocketDispatcher::OnEvent(uint32_t ff, int err) { |
| 720 int cache_id = id_; | 734 int cache_id = id_; |
| 721 // Make sure we deliver connect/accept first. Otherwise, consumers may see | 735 // Make sure we deliver connect/accept first. Otherwise, consumers may see |
| 722 // something like a READ followed by a CONNECT, which would be odd. | 736 // something like a READ followed by a CONNECT, which would be odd. |
| 723 if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) { | 737 if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) { |
| 724 if (ff != DE_CONNECT) | 738 if (ff != DE_CONNECT) |
| 725 LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff; | 739 LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff; |
| 726 enabled_events_ &= ~DE_CONNECT; | 740 DisableEvents(DE_CONNECT); |
| 727 #if !defined(NDEBUG) | 741 #if !defined(NDEBUG) |
| 728 dbg_addr_ = "Connected @ "; | 742 dbg_addr_ = "Connected @ "; |
| 729 dbg_addr_.append(GetRemoteAddress().ToString()); | 743 dbg_addr_.append(GetRemoteAddress().ToString()); |
| 730 #endif | 744 #endif |
| 731 SignalConnectEvent(this); | 745 SignalConnectEvent(this); |
| 732 } | 746 } |
| 733 if (((ff & DE_ACCEPT) != 0) && (id_ == cache_id)) { | 747 if (((ff & DE_ACCEPT) != 0) && (id_ == cache_id)) { |
| 734 enabled_events_ &= ~DE_ACCEPT; | 748 DisableEvents(DE_ACCEPT); |
| 735 SignalReadEvent(this); | 749 SignalReadEvent(this); |
| 736 } | 750 } |
| 737 if ((ff & DE_READ) != 0) { | 751 if ((ff & DE_READ) != 0) { |
| 738 enabled_events_ &= ~DE_READ; | 752 DisableEvents(DE_READ); |
| 739 SignalReadEvent(this); | 753 SignalReadEvent(this); |
| 740 } | 754 } |
| 741 if (((ff & DE_WRITE) != 0) && (id_ == cache_id)) { | 755 if (((ff & DE_WRITE) != 0) && (id_ == cache_id)) { |
| 742 enabled_events_ &= ~DE_WRITE; | 756 DisableEvents(DE_WRITE); |
| 743 SignalWriteEvent(this); | 757 SignalWriteEvent(this); |
| 744 } | 758 } |
| 745 if (((ff & DE_CLOSE) != 0) && (id_ == cache_id)) { | 759 if (((ff & DE_CLOSE) != 0) && (id_ == cache_id)) { |
| 746 signal_close_ = true; | 760 signal_close_ = true; |
| 747 signal_err_ = err; | 761 signal_err_ = err; |
| 748 } | 762 } |
| 749 } | 763 } |
| 750 | 764 |
| 751 #elif defined(WEBRTC_POSIX) | 765 #elif defined(WEBRTC_POSIX) |
| 752 | 766 |
| 753 void SocketDispatcher::OnEvent(uint32_t ff, int err) { | 767 void SocketDispatcher::OnEvent(uint32_t ff, int err) { |
| 754 // Make sure we deliver connect/accept first. Otherwise, consumers may see | 768 // Make sure we deliver connect/accept first. Otherwise, consumers may see |
| 755 // something like a READ followed by a CONNECT, which would be odd. | 769 // something like a READ followed by a CONNECT, which would be odd. |
| 756 if ((ff & DE_CONNECT) != 0) { | 770 if ((ff & DE_CONNECT) != 0) { |
| 757 enabled_events_ &= ~DE_CONNECT; | 771 DisableEvents(DE_CONNECT); |
| 758 SignalConnectEvent(this); | 772 SignalConnectEvent(this); |
| 759 } | 773 } |
| 760 if ((ff & DE_ACCEPT) != 0) { | 774 if ((ff & DE_ACCEPT) != 0) { |
| 761 enabled_events_ &= ~DE_ACCEPT; | 775 DisableEvents(DE_ACCEPT); |
| 762 SignalReadEvent(this); | 776 SignalReadEvent(this); |
| 763 } | 777 } |
| 764 if ((ff & DE_READ) != 0) { | 778 if ((ff & DE_READ) != 0) { |
| 765 enabled_events_ &= ~DE_READ; | 779 DisableEvents(DE_READ); |
| 766 SignalReadEvent(this); | 780 SignalReadEvent(this); |
| 767 } | 781 } |
| 768 if ((ff & DE_WRITE) != 0) { | 782 if ((ff & DE_WRITE) != 0) { |
| 769 enabled_events_ &= ~DE_WRITE; | 783 DisableEvents(DE_WRITE); |
| 770 SignalWriteEvent(this); | 784 SignalWriteEvent(this); |
| 771 } | 785 } |
| 772 if ((ff & DE_CLOSE) != 0) { | 786 if ((ff & DE_CLOSE) != 0) { |
| 773 // The socket is now dead to us, so stop checking it. | 787 // The socket is now dead to us, so stop checking it. |
| 774 enabled_events_ = 0; | 788 SetEnabledEvents(0); |
| 775 SignalCloseEvent(this, err); | 789 SignalCloseEvent(this, err); |
| 776 } | 790 } |
| 777 } | 791 } |
| 778 | 792 |
| 779 #endif // WEBRTC_POSIX | 793 #endif // WEBRTC_POSIX |
| 780 | 794 |
| 781 int SocketDispatcher::Close() { | 795 int SocketDispatcher::Close() { |
| 782 if (s_ == INVALID_SOCKET) | 796 if (s_ == INVALID_SOCKET) |
| 783 return 0; | 797 return 0; |
| 784 | 798 |
| (...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1572 break; | 1586 break; |
| 1573 } | 1587 } |
| 1574 } | 1588 } |
| 1575 | 1589 |
| 1576 // Done | 1590 // Done |
| 1577 return true; | 1591 return true; |
| 1578 } | 1592 } |
| 1579 #endif // WEBRTC_WIN | 1593 #endif // WEBRTC_WIN |
| 1580 | 1594 |
| 1581 } // namespace rtc | 1595 } // namespace rtc |
| OLD | NEW |