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 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 // don't want. By specifying this flag, we'll just get the error EPIPE | 305 // don't want. By specifying this flag, we'll just get the error EPIPE |
306 // instead and can handle the error gracefully. | 306 // instead and can handle the error gracefully. |
307 MSG_NOSIGNAL | 307 MSG_NOSIGNAL |
308 #else | 308 #else |
309 0 | 309 0 |
310 #endif | 310 #endif |
311 ); | 311 ); |
312 UpdateLastError(); | 312 UpdateLastError(); |
313 MaybeRemapSendError(); | 313 MaybeRemapSendError(); |
314 // We have seen minidumps where this may be false. | 314 // We have seen minidumps where this may be false. |
315 ASSERT(sent <= static_cast<int>(cb)); | 315 RTC_DCHECK(sent <= static_cast<int>(cb)); |
316 if ((sent > 0 && sent < static_cast<int>(cb)) || | 316 if ((sent > 0 && sent < static_cast<int>(cb)) || |
317 (sent < 0 && IsBlockingError(GetError()))) { | 317 (sent < 0 && IsBlockingError(GetError()))) { |
318 enabled_events_ |= DE_WRITE; | 318 enabled_events_ |= DE_WRITE; |
319 } | 319 } |
320 return sent; | 320 return sent; |
321 } | 321 } |
322 | 322 |
323 int PhysicalSocket::SendTo(const void* buffer, | 323 int PhysicalSocket::SendTo(const void* buffer, |
324 size_t length, | 324 size_t length, |
325 const SocketAddress& addr) { | 325 const SocketAddress& addr) { |
326 sockaddr_storage saddr; | 326 sockaddr_storage saddr; |
327 size_t len = addr.ToSockAddrStorage(&saddr); | 327 size_t len = addr.ToSockAddrStorage(&saddr); |
328 int sent = DoSendTo( | 328 int sent = DoSendTo( |
329 s_, static_cast<const char *>(buffer), static_cast<int>(length), | 329 s_, static_cast<const char *>(buffer), static_cast<int>(length), |
330 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 330 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
331 // Suppress SIGPIPE. See above for explanation. | 331 // Suppress SIGPIPE. See above for explanation. |
332 MSG_NOSIGNAL, | 332 MSG_NOSIGNAL, |
333 #else | 333 #else |
334 0, | 334 0, |
335 #endif | 335 #endif |
336 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); | 336 reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len)); |
337 UpdateLastError(); | 337 UpdateLastError(); |
338 MaybeRemapSendError(); | 338 MaybeRemapSendError(); |
339 // We have seen minidumps where this may be false. | 339 // We have seen minidumps where this may be false. |
340 ASSERT(sent <= static_cast<int>(length)); | 340 RTC_DCHECK(sent <= static_cast<int>(length)); |
341 if ((sent > 0 && sent < static_cast<int>(length)) || | 341 if ((sent > 0 && sent < static_cast<int>(length)) || |
342 (sent < 0 && IsBlockingError(GetError()))) { | 342 (sent < 0 && IsBlockingError(GetError()))) { |
343 enabled_events_ |= DE_WRITE; | 343 enabled_events_ |= DE_WRITE; |
344 } | 344 } |
345 return sent; | 345 return sent; |
346 } | 346 } |
347 | 347 |
348 int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { | 348 int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) { |
349 int received = ::recv(s_, static_cast<char*>(buffer), | 349 int received = ::recv(s_, static_cast<char*>(buffer), |
350 static_cast<int>(length), 0); | 350 static_cast<int>(length), 0); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 #elif defined(WEBRTC_LINUX) | 492 #elif defined(WEBRTC_LINUX) |
493 // Gets the path MTU. | 493 // Gets the path MTU. |
494 int value; | 494 int value; |
495 socklen_t vlen = sizeof(value); | 495 socklen_t vlen = sizeof(value); |
496 int err = getsockopt(s_, IPPROTO_IP, IP_MTU, &value, &vlen); | 496 int err = getsockopt(s_, IPPROTO_IP, IP_MTU, &value, &vlen); |
497 if (err < 0) { | 497 if (err < 0) { |
498 UpdateLastError(); | 498 UpdateLastError(); |
499 return err; | 499 return err; |
500 } | 500 } |
501 | 501 |
502 ASSERT((0 <= value) && (value <= 65536)); | 502 RTC_DCHECK((0 <= value) && (value <= 65536)); |
503 *mtu = value; | 503 *mtu = value; |
504 return 0; | 504 return 0; |
505 #elif defined(__native_client__) | 505 #elif defined(__native_client__) |
506 // Most socket operations, including this, will fail in NaCl's sandbox. | 506 // Most socket operations, including this, will fail in NaCl's sandbox. |
507 error_ = EACCES; | 507 error_ = EACCES; |
508 return -1; | 508 return -1; |
509 #endif | 509 #endif |
510 } | 510 } |
511 | 511 |
512 SOCKET PhysicalSocket::DoAccept(SOCKET socket, | 512 SOCKET PhysicalSocket::DoAccept(SOCKET socket, |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 : PhysicalSocket(ss, s) | 618 : PhysicalSocket(ss, s) |
619 #endif | 619 #endif |
620 { | 620 { |
621 } | 621 } |
622 | 622 |
623 SocketDispatcher::~SocketDispatcher() { | 623 SocketDispatcher::~SocketDispatcher() { |
624 Close(); | 624 Close(); |
625 } | 625 } |
626 | 626 |
627 bool SocketDispatcher::Initialize() { | 627 bool SocketDispatcher::Initialize() { |
628 ASSERT(s_ != INVALID_SOCKET); | 628 RTC_DCHECK(s_ != INVALID_SOCKET); |
629 // Must be a non-blocking | 629 // Must be a non-blocking |
630 #if defined(WEBRTC_WIN) | 630 #if defined(WEBRTC_WIN) |
631 u_long argp = 1; | 631 u_long argp = 1; |
632 ioctlsocket(s_, FIONBIO, &argp); | 632 ioctlsocket(s_, FIONBIO, &argp); |
633 #elif defined(WEBRTC_POSIX) | 633 #elif defined(WEBRTC_POSIX) |
634 fcntl(s_, F_SETFL, fcntl(s_, F_GETFL, 0) | O_NONBLOCK); | 634 fcntl(s_, F_SETFL, fcntl(s_, F_GETFL, 0) | O_NONBLOCK); |
635 #endif | 635 #endif |
636 ss_->Add(this); | 636 ss_->Add(this); |
637 return true; | 637 return true; |
638 } | 638 } |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 // There is just a single global instance. (Signal handlers do not get any | 883 // There is just a single global instance. (Signal handlers do not get any |
884 // sort of user-defined void * parameter, so they can't access anything that | 884 // sort of user-defined void * parameter, so they can't access anything that |
885 // isn't global.) | 885 // isn't global.) |
886 static PosixSignalHandler* Instance() { | 886 static PosixSignalHandler* Instance() { |
887 RTC_DEFINE_STATIC_LOCAL(PosixSignalHandler, instance, ()); | 887 RTC_DEFINE_STATIC_LOCAL(PosixSignalHandler, instance, ()); |
888 return &instance; | 888 return &instance; |
889 } | 889 } |
890 | 890 |
891 // Returns true if the given signal number is set. | 891 // Returns true if the given signal number is set. |
892 bool IsSignalSet(int signum) const { | 892 bool IsSignalSet(int signum) const { |
893 ASSERT(signum < static_cast<int>(arraysize(received_signal_))); | 893 RTC_DCHECK(signum < static_cast<int>(arraysize(received_signal_))); |
894 if (signum < static_cast<int>(arraysize(received_signal_))) { | 894 if (signum < static_cast<int>(arraysize(received_signal_))) { |
895 return received_signal_[signum]; | 895 return received_signal_[signum]; |
896 } else { | 896 } else { |
897 return false; | 897 return false; |
898 } | 898 } |
899 } | 899 } |
900 | 900 |
901 // Clears the given signal number. | 901 // Clears the given signal number. |
902 void ClearSignal(int signum) { | 902 void ClearSignal(int signum) { |
903 ASSERT(signum < static_cast<int>(arraysize(received_signal_))); | 903 RTC_DCHECK(signum < static_cast<int>(arraysize(received_signal_))); |
904 if (signum < static_cast<int>(arraysize(received_signal_))) { | 904 if (signum < static_cast<int>(arraysize(received_signal_))) { |
905 received_signal_[signum] = false; | 905 received_signal_[signum] = false; |
906 } | 906 } |
907 } | 907 } |
908 | 908 |
909 // Returns the file descriptor to monitor for signal events. | 909 // Returns the file descriptor to monitor for signal events. |
910 int GetDescriptor() const { | 910 int GetDescriptor() const { |
911 return afd_[0]; | 911 return afd_[0]; |
912 } | 912 } |
913 | 913 |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1138 } | 1138 } |
1139 | 1139 |
1140 PhysicalSocketServer::~PhysicalSocketServer() { | 1140 PhysicalSocketServer::~PhysicalSocketServer() { |
1141 #if defined(WEBRTC_WIN) | 1141 #if defined(WEBRTC_WIN) |
1142 WSACloseEvent(socket_ev_); | 1142 WSACloseEvent(socket_ev_); |
1143 #endif | 1143 #endif |
1144 #if defined(WEBRTC_POSIX) | 1144 #if defined(WEBRTC_POSIX) |
1145 signal_dispatcher_.reset(); | 1145 signal_dispatcher_.reset(); |
1146 #endif | 1146 #endif |
1147 delete signal_wakeup_; | 1147 delete signal_wakeup_; |
1148 ASSERT(dispatchers_.empty()); | 1148 RTC_DCHECK(dispatchers_.empty()); |
1149 } | 1149 } |
1150 | 1150 |
1151 void PhysicalSocketServer::WakeUp() { | 1151 void PhysicalSocketServer::WakeUp() { |
1152 signal_wakeup_->Signal(); | 1152 signal_wakeup_->Signal(); |
1153 } | 1153 } |
1154 | 1154 |
1155 Socket* PhysicalSocketServer::CreateSocket(int type) { | 1155 Socket* PhysicalSocketServer::CreateSocket(int type) { |
1156 return CreateSocket(AF_INET, type); | 1156 return CreateSocket(AF_INET, type); |
1157 } | 1157 } |
1158 | 1158 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1264 | 1264 |
1265 fWait_ = true; | 1265 fWait_ = true; |
1266 | 1266 |
1267 while (fWait_) { | 1267 while (fWait_) { |
1268 int fdmax = -1; | 1268 int fdmax = -1; |
1269 { | 1269 { |
1270 CritScope cr(&crit_); | 1270 CritScope cr(&crit_); |
1271 for (size_t i = 0; i < dispatchers_.size(); ++i) { | 1271 for (size_t i = 0; i < dispatchers_.size(); ++i) { |
1272 // Query dispatchers for read and write wait state | 1272 // Query dispatchers for read and write wait state |
1273 Dispatcher *pdispatcher = dispatchers_[i]; | 1273 Dispatcher *pdispatcher = dispatchers_[i]; |
1274 ASSERT(pdispatcher); | 1274 RTC_DCHECK(pdispatcher); |
1275 if (!process_io && (pdispatcher != signal_wakeup_)) | 1275 if (!process_io && (pdispatcher != signal_wakeup_)) |
1276 continue; | 1276 continue; |
1277 int fd = pdispatcher->GetDescriptor(); | 1277 int fd = pdispatcher->GetDescriptor(); |
1278 if (fd > fdmax) | 1278 if (fd > fdmax) |
1279 fdmax = fd; | 1279 fdmax = fd; |
1280 | 1280 |
1281 uint32_t ff = pdispatcher->GetRequestedEvents(); | 1281 uint32_t ff = pdispatcher->GetRequestedEvents(); |
1282 if (ff & (DE_READ | DE_ACCEPT)) | 1282 if (ff & (DE_READ | DE_ACCEPT)) |
1283 FD_SET(fd, &fdsRead); | 1283 FD_SET(fd, &fdsRead); |
1284 if (ff & (DE_WRITE | DE_CONNECT)) | 1284 if (ff & (DE_WRITE | DE_CONNECT)) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1365 ptvWait->tv_sec = 0; | 1365 ptvWait->tv_sec = 0; |
1366 ptvWait->tv_usec = 0; | 1366 ptvWait->tv_usec = 0; |
1367 struct timeval tvT; | 1367 struct timeval tvT; |
1368 gettimeofday(&tvT, NULL); | 1368 gettimeofday(&tvT, NULL); |
1369 if ((tvStop.tv_sec > tvT.tv_sec) | 1369 if ((tvStop.tv_sec > tvT.tv_sec) |
1370 || ((tvStop.tv_sec == tvT.tv_sec) | 1370 || ((tvStop.tv_sec == tvT.tv_sec) |
1371 && (tvStop.tv_usec > tvT.tv_usec))) { | 1371 && (tvStop.tv_usec > tvT.tv_usec))) { |
1372 ptvWait->tv_sec = tvStop.tv_sec - tvT.tv_sec; | 1372 ptvWait->tv_sec = tvStop.tv_sec - tvT.tv_sec; |
1373 ptvWait->tv_usec = tvStop.tv_usec - tvT.tv_usec; | 1373 ptvWait->tv_usec = tvStop.tv_usec - tvT.tv_usec; |
1374 if (ptvWait->tv_usec < 0) { | 1374 if (ptvWait->tv_usec < 0) { |
1375 ASSERT(ptvWait->tv_sec > 0); | 1375 RTC_DCHECK(ptvWait->tv_sec > 0); |
1376 ptvWait->tv_usec += 1000000; | 1376 ptvWait->tv_usec += 1000000; |
1377 ptvWait->tv_sec -= 1; | 1377 ptvWait->tv_sec -= 1; |
1378 } | 1378 } |
1379 } | 1379 } |
1380 } | 1380 } |
1381 } | 1381 } |
1382 | 1382 |
1383 return true; | 1383 return true; |
1384 } | 1384 } |
1385 | 1385 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1469 // We just signalled close, don't poll this socket | 1469 // We just signalled close, don't poll this socket |
1470 } else if (s != INVALID_SOCKET) { | 1470 } else if (s != INVALID_SOCKET) { |
1471 WSAEventSelect(s, | 1471 WSAEventSelect(s, |
1472 events[0], | 1472 events[0], |
1473 FlagsToEvents(disp->GetRequestedEvents())); | 1473 FlagsToEvents(disp->GetRequestedEvents())); |
1474 } else { | 1474 } else { |
1475 events.push_back(disp->GetWSAEvent()); | 1475 events.push_back(disp->GetWSAEvent()); |
1476 event_owners.push_back(disp); | 1476 event_owners.push_back(disp); |
1477 } | 1477 } |
1478 } | 1478 } |
1479 ASSERT(iterators_.back() == &i); | 1479 RTC_DCHECK(iterators_.back() == &i); |
1480 iterators_.pop_back(); | 1480 iterators_.pop_back(); |
1481 } | 1481 } |
1482 | 1482 |
1483 // Which is shorter, the delay wait or the asked wait? | 1483 // Which is shorter, the delay wait or the asked wait? |
1484 | 1484 |
1485 int64_t cmsNext; | 1485 int64_t cmsNext; |
1486 if (cmsWait == kForever) { | 1486 if (cmsWait == kForever) { |
1487 cmsNext = cmsWait; | 1487 cmsNext = cmsWait; |
1488 } else { | 1488 } else { |
1489 cmsNext = std::max<int64_t>(0, cmsTotal - cmsElapsed); | 1489 cmsNext = std::max<int64_t>(0, cmsTotal - cmsElapsed); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1572 if (wsaEvents.lNetworkEvents & FD_CLOSE) { | 1572 if (wsaEvents.lNetworkEvents & FD_CLOSE) { |
1573 ff |= DE_CLOSE; | 1573 ff |= DE_CLOSE; |
1574 errcode = wsaEvents.iErrorCode[FD_CLOSE_BIT]; | 1574 errcode = wsaEvents.iErrorCode[FD_CLOSE_BIT]; |
1575 } | 1575 } |
1576 if (ff != 0) { | 1576 if (ff != 0) { |
1577 disp->OnPreEvent(ff); | 1577 disp->OnPreEvent(ff); |
1578 disp->OnEvent(ff, errcode); | 1578 disp->OnEvent(ff, errcode); |
1579 } | 1579 } |
1580 } | 1580 } |
1581 } | 1581 } |
1582 ASSERT(iterators_.back() == &end); | 1582 RTC_DCHECK(iterators_.back() == &end); |
1583 iterators_.pop_back(); | 1583 iterators_.pop_back(); |
1584 ASSERT(iterators_.back() == &i); | 1584 RTC_DCHECK(iterators_.back() == &i); |
1585 iterators_.pop_back(); | 1585 iterators_.pop_back(); |
1586 } | 1586 } |
1587 | 1587 |
1588 // Reset the network event until new activity occurs | 1588 // Reset the network event until new activity occurs |
1589 WSAResetEvent(socket_ev_); | 1589 WSAResetEvent(socket_ev_); |
1590 } | 1590 } |
1591 | 1591 |
1592 // Break? | 1592 // Break? |
1593 if (!fWait_) | 1593 if (!fWait_) |
1594 break; | 1594 break; |
1595 cmsElapsed = TimeSince(msStart); | 1595 cmsElapsed = TimeSince(msStart); |
1596 if ((cmsWait != kForever) && (cmsElapsed >= cmsWait)) { | 1596 if ((cmsWait != kForever) && (cmsElapsed >= cmsWait)) { |
1597 break; | 1597 break; |
1598 } | 1598 } |
1599 } | 1599 } |
1600 | 1600 |
1601 // Done | 1601 // Done |
1602 return true; | 1602 return true; |
1603 } | 1603 } |
1604 #endif // WEBRTC_WIN | 1604 #endif // WEBRTC_WIN |
1605 | 1605 |
1606 } // namespace rtc | 1606 } // namespace rtc |
OLD | NEW |