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 | 10 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 #endif // WEBRTC_POSIX | 61 #endif // WEBRTC_POSIX |
62 | 62 |
63 #if defined(WEBRTC_WIN) | 63 #if defined(WEBRTC_WIN) |
64 typedef char* SockOptArg; | 64 typedef char* SockOptArg; |
65 #endif | 65 #endif |
66 | 66 |
67 namespace rtc { | 67 namespace rtc { |
68 | 68 |
69 #if defined(WEBRTC_WIN) | 69 #if defined(WEBRTC_WIN) |
70 // Standard MTUs, from RFC 1191 | 70 // Standard MTUs, from RFC 1191 |
71 const uint16 PACKET_MAXIMUMS[] = { | 71 const uint16_t PACKET_MAXIMUMS[] = { |
72 65535, // Theoretical maximum, Hyperchannel | 72 65535, // Theoretical maximum, Hyperchannel |
73 32000, // Nothing | 73 32000, // Nothing |
74 17914, // 16Mb IBM Token Ring | 74 17914, // 16Mb IBM Token Ring |
75 8166, // IEEE 802.4 | 75 8166, // IEEE 802.4 |
76 //4464, // IEEE 802.5 (4Mb max) | 76 // 4464, // IEEE 802.5 (4Mb max) |
77 4352, // FDDI | 77 4352, // FDDI |
78 //2048, // Wideband Network | 78 // 2048, // Wideband Network |
79 2002, // IEEE 802.5 (4Mb recommended) | 79 2002, // IEEE 802.5 (4Mb recommended) |
80 //1536, // Expermental Ethernet Networks | 80 // 1536, // Expermental Ethernet Networks |
81 //1500, // Ethernet, Point-to-Point (default) | 81 // 1500, // Ethernet, Point-to-Point (default) |
82 1492, // IEEE 802.3 | 82 1492, // IEEE 802.3 |
83 1006, // SLIP, ARPANET | 83 1006, // SLIP, ARPANET |
84 //576, // X.25 Networks | 84 // 576, // X.25 Networks |
85 //544, // DEC IP Portal | 85 // 544, // DEC IP Portal |
86 //512, // NETBIOS | 86 // 512, // NETBIOS |
87 508, // IEEE 802/Source-Rt Bridge, ARCNET | 87 508, // IEEE 802/Source-Rt Bridge, ARCNET |
88 296, // Point-to-Point (low delay) | 88 296, // Point-to-Point (low delay) |
89 68, // Official minimum | 89 68, // Official minimum |
90 0, // End of list marker | 90 0, // End of list marker |
91 }; | 91 }; |
92 | 92 |
93 static const int IP_HEADER_SIZE = 20u; | 93 static const int IP_HEADER_SIZE = 20u; |
94 static const int IPV6_HEADER_SIZE = 40u; | 94 static const int IPV6_HEADER_SIZE = 40u; |
95 static const int ICMP_HEADER_SIZE = 8u; | 95 static const int ICMP_HEADER_SIZE = 8u; |
96 static const int ICMP_PING_TIMEOUT_MILLIS = 10000u; | 96 static const int ICMP_PING_TIMEOUT_MILLIS = 10000u; |
97 #endif | 97 #endif |
98 | 98 |
99 class PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> { | 99 class PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> { |
100 public: | 100 public: |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 s_ = INVALID_SOCKET; | 391 s_ = INVALID_SOCKET; |
392 state_ = CS_CLOSED; | 392 state_ = CS_CLOSED; |
393 enabled_events_ = 0; | 393 enabled_events_ = 0; |
394 if (resolver_) { | 394 if (resolver_) { |
395 resolver_->Destroy(false); | 395 resolver_->Destroy(false); |
396 resolver_ = NULL; | 396 resolver_ = NULL; |
397 } | 397 } |
398 return err; | 398 return err; |
399 } | 399 } |
400 | 400 |
401 int EstimateMTU(uint16* mtu) override { | 401 int EstimateMTU(uint16_t* mtu) override { |
402 SocketAddress addr = GetRemoteAddress(); | 402 SocketAddress addr = GetRemoteAddress(); |
403 if (addr.IsAny()) { | 403 if (addr.IsAny()) { |
404 SetError(ENOTCONN); | 404 SetError(ENOTCONN); |
405 return -1; | 405 return -1; |
406 } | 406 } |
407 | 407 |
408 #if defined(WEBRTC_WIN) | 408 #if defined(WEBRTC_WIN) |
409 // Gets the interface MTU (TTL=1) for the interface used to reach |addr|. | 409 // Gets the interface MTU (TTL=1) for the interface used to reach |addr|. |
410 WinPing ping; | 410 WinPing ping; |
411 if (!ping.IsValid()) { | 411 if (!ping.IsValid()) { |
412 SetError(EINVAL); // can't think of a better error ID | 412 SetError(EINVAL); // can't think of a better error ID |
413 return -1; | 413 return -1; |
414 } | 414 } |
415 int header_size = ICMP_HEADER_SIZE; | 415 int header_size = ICMP_HEADER_SIZE; |
416 if (addr.family() == AF_INET6) { | 416 if (addr.family() == AF_INET6) { |
417 header_size += IPV6_HEADER_SIZE; | 417 header_size += IPV6_HEADER_SIZE; |
418 } else if (addr.family() == AF_INET) { | 418 } else if (addr.family() == AF_INET) { |
419 header_size += IP_HEADER_SIZE; | 419 header_size += IP_HEADER_SIZE; |
420 } | 420 } |
421 | 421 |
422 for (int level = 0; PACKET_MAXIMUMS[level + 1] > 0; ++level) { | 422 for (int level = 0; PACKET_MAXIMUMS[level + 1] > 0; ++level) { |
423 int32 size = PACKET_MAXIMUMS[level] - header_size; | 423 int32_t size = PACKET_MAXIMUMS[level] - header_size; |
424 WinPing::PingResult result = ping.Ping(addr.ipaddr(), size, | 424 WinPing::PingResult result = ping.Ping(addr.ipaddr(), size, |
425 ICMP_PING_TIMEOUT_MILLIS, | 425 ICMP_PING_TIMEOUT_MILLIS, |
426 1, false); | 426 1, false); |
427 if (result == WinPing::PING_FAIL) { | 427 if (result == WinPing::PING_FAIL) { |
428 SetError(EINVAL); // can't think of a better error ID | 428 SetError(EINVAL); // can't think of a better error ID |
429 return -1; | 429 return -1; |
430 } else if (result != WinPing::PING_TOO_LARGE) { | 430 } else if (result != WinPing::PING_TOO_LARGE) { |
431 *mtu = PACKET_MAXIMUMS[level]; | 431 *mtu = PACKET_MAXIMUMS[level]; |
432 return 0; | 432 return 0; |
433 } | 433 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 return -1; // No logging is necessary as this not a OS socket option. | 534 return -1; // No logging is necessary as this not a OS socket option. |
535 default: | 535 default: |
536 ASSERT(false); | 536 ASSERT(false); |
537 return -1; | 537 return -1; |
538 } | 538 } |
539 return 0; | 539 return 0; |
540 } | 540 } |
541 | 541 |
542 PhysicalSocketServer* ss_; | 542 PhysicalSocketServer* ss_; |
543 SOCKET s_; | 543 SOCKET s_; |
544 uint8 enabled_events_; | 544 uint8_t enabled_events_; |
545 bool udp_; | 545 bool udp_; |
546 int error_; | 546 int error_; |
547 // Protects |error_| that is accessed from different threads. | 547 // Protects |error_| that is accessed from different threads. |
548 mutable CriticalSection crit_; | 548 mutable CriticalSection crit_; |
549 ConnState state_; | 549 ConnState state_; |
550 AsyncResolver* resolver_; | 550 AsyncResolver* resolver_; |
551 | 551 |
552 #ifdef _DEBUG | 552 #ifdef _DEBUG |
553 std::string dbg_addr_; | 553 std::string dbg_addr_; |
554 #endif // _DEBUG; | 554 #endif // _DEBUG; |
(...skipping 10 matching lines...) Expand all Loading... |
565 | 565 |
566 ~EventDispatcher() override { | 566 ~EventDispatcher() override { |
567 ss_->Remove(this); | 567 ss_->Remove(this); |
568 close(afd_[0]); | 568 close(afd_[0]); |
569 close(afd_[1]); | 569 close(afd_[1]); |
570 } | 570 } |
571 | 571 |
572 virtual void Signal() { | 572 virtual void Signal() { |
573 CritScope cs(&crit_); | 573 CritScope cs(&crit_); |
574 if (!fSignaled_) { | 574 if (!fSignaled_) { |
575 const uint8 b[1] = { 0 }; | 575 const uint8_t b[1] = {0}; |
576 if (VERIFY(1 == write(afd_[1], b, sizeof(b)))) { | 576 if (VERIFY(1 == write(afd_[1], b, sizeof(b)))) { |
577 fSignaled_ = true; | 577 fSignaled_ = true; |
578 } | 578 } |
579 } | 579 } |
580 } | 580 } |
581 | 581 |
582 uint32 GetRequestedEvents() override { return DE_READ; } | 582 uint32_t GetRequestedEvents() override { return DE_READ; } |
583 | 583 |
584 void OnPreEvent(uint32 ff) override { | 584 void OnPreEvent(uint32_t ff) override { |
585 // It is not possible to perfectly emulate an auto-resetting event with | 585 // It is not possible to perfectly emulate an auto-resetting event with |
586 // pipes. This simulates it by resetting before the event is handled. | 586 // pipes. This simulates it by resetting before the event is handled. |
587 | 587 |
588 CritScope cs(&crit_); | 588 CritScope cs(&crit_); |
589 if (fSignaled_) { | 589 if (fSignaled_) { |
590 uint8 b[4]; // Allow for reading more than 1 byte, but expect 1. | 590 uint8_t b[4]; // Allow for reading more than 1 byte, but expect 1. |
591 VERIFY(1 == read(afd_[0], b, sizeof(b))); | 591 VERIFY(1 == read(afd_[0], b, sizeof(b))); |
592 fSignaled_ = false; | 592 fSignaled_ = false; |
593 } | 593 } |
594 } | 594 } |
595 | 595 |
596 void OnEvent(uint32 ff, int err) override { ASSERT(false); } | 596 void OnEvent(uint32_t ff, int err) override { ASSERT(false); } |
597 | 597 |
598 int GetDescriptor() override { return afd_[0]; } | 598 int GetDescriptor() override { return afd_[0]; } |
599 | 599 |
600 bool IsDescriptorClosed() override { return false; } | 600 bool IsDescriptorClosed() override { return false; } |
601 | 601 |
602 private: | 602 private: |
603 PhysicalSocketServer *ss_; | 603 PhysicalSocketServer *ss_; |
604 int afd_[2]; | 604 int afd_[2]; |
605 bool fSignaled_; | 605 bool fSignaled_; |
606 CriticalSection crit_; | 606 CriticalSection crit_; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 // user-level state of the process, since the handler could be executed at any | 654 // user-level state of the process, since the handler could be executed at any |
655 // time on any thread. | 655 // time on any thread. |
656 void OnPosixSignalReceived(int signum) { | 656 void OnPosixSignalReceived(int signum) { |
657 if (signum >= ARRAY_SIZE(received_signal_)) { | 657 if (signum >= ARRAY_SIZE(received_signal_)) { |
658 // We don't have space in our array for this. | 658 // We don't have space in our array for this. |
659 return; | 659 return; |
660 } | 660 } |
661 // Set a flag saying we've seen this signal. | 661 // Set a flag saying we've seen this signal. |
662 received_signal_[signum] = true; | 662 received_signal_[signum] = true; |
663 // Notify application code that we got a signal. | 663 // Notify application code that we got a signal. |
664 const uint8 b[1] = { 0 }; | 664 const uint8_t b[1] = {0}; |
665 if (-1 == write(afd_[1], b, sizeof(b))) { | 665 if (-1 == write(afd_[1], b, sizeof(b))) { |
666 // Nothing we can do here. If there's an error somehow then there's | 666 // Nothing we can do here. If there's an error somehow then there's |
667 // nothing we can safely do from a signal handler. | 667 // nothing we can safely do from a signal handler. |
668 // No, we can't even safely log it. | 668 // No, we can't even safely log it. |
669 // But, we still have to check the return value here. Otherwise, | 669 // But, we still have to check the return value here. Otherwise, |
670 // GCC 4.4.1 complains ignoring return value. Even (void) doesn't help. | 670 // GCC 4.4.1 complains ignoring return value. Even (void) doesn't help. |
671 return; | 671 return; |
672 } | 672 } |
673 } | 673 } |
674 | 674 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 // These are boolean flags that will be set in our signal handler and read | 711 // These are boolean flags that will be set in our signal handler and read |
712 // and cleared from Wait(). There is a race involved in this, but it is | 712 // and cleared from Wait(). There is a race involved in this, but it is |
713 // benign. The signal handler sets the flag before signaling the pipe, so | 713 // benign. The signal handler sets the flag before signaling the pipe, so |
714 // we'll never end up blocking in select() while a flag is still true. | 714 // we'll never end up blocking in select() while a flag is still true. |
715 // However, if two of the same signal arrive close to each other then it's | 715 // However, if two of the same signal arrive close to each other then it's |
716 // possible that the second time the handler may set the flag while it's still | 716 // possible that the second time the handler may set the flag while it's still |
717 // true, meaning that signal will be missed. But the first occurrence of it | 717 // true, meaning that signal will be missed. But the first occurrence of it |
718 // will still be handled, so this isn't a problem. | 718 // will still be handled, so this isn't a problem. |
719 // Volatile is not necessary here for correctness, but this data _is_ volatile | 719 // Volatile is not necessary here for correctness, but this data _is_ volatile |
720 // so I've marked it as such. | 720 // so I've marked it as such. |
721 volatile uint8 received_signal_[kNumPosixSignals]; | 721 volatile uint8_t received_signal_[kNumPosixSignals]; |
722 }; | 722 }; |
723 | 723 |
724 class PosixSignalDispatcher : public Dispatcher { | 724 class PosixSignalDispatcher : public Dispatcher { |
725 public: | 725 public: |
726 PosixSignalDispatcher(PhysicalSocketServer *owner) : owner_(owner) { | 726 PosixSignalDispatcher(PhysicalSocketServer *owner) : owner_(owner) { |
727 owner_->Add(this); | 727 owner_->Add(this); |
728 } | 728 } |
729 | 729 |
730 ~PosixSignalDispatcher() override { | 730 ~PosixSignalDispatcher() override { |
731 owner_->Remove(this); | 731 owner_->Remove(this); |
732 } | 732 } |
733 | 733 |
734 uint32 GetRequestedEvents() override { return DE_READ; } | 734 uint32_t GetRequestedEvents() override { return DE_READ; } |
735 | 735 |
736 void OnPreEvent(uint32 ff) override { | 736 void OnPreEvent(uint32_t ff) override { |
737 // Events might get grouped if signals come very fast, so we read out up to | 737 // Events might get grouped if signals come very fast, so we read out up to |
738 // 16 bytes to make sure we keep the pipe empty. | 738 // 16 bytes to make sure we keep the pipe empty. |
739 uint8 b[16]; | 739 uint8_t b[16]; |
740 ssize_t ret = read(GetDescriptor(), b, sizeof(b)); | 740 ssize_t ret = read(GetDescriptor(), b, sizeof(b)); |
741 if (ret < 0) { | 741 if (ret < 0) { |
742 LOG_ERR(LS_WARNING) << "Error in read()"; | 742 LOG_ERR(LS_WARNING) << "Error in read()"; |
743 } else if (ret == 0) { | 743 } else if (ret == 0) { |
744 LOG(LS_WARNING) << "Should have read at least one byte"; | 744 LOG(LS_WARNING) << "Should have read at least one byte"; |
745 } | 745 } |
746 } | 746 } |
747 | 747 |
748 void OnEvent(uint32 ff, int err) override { | 748 void OnEvent(uint32_t ff, int err) override { |
749 for (int signum = 0; signum < PosixSignalHandler::kNumPosixSignals; | 749 for (int signum = 0; signum < PosixSignalHandler::kNumPosixSignals; |
750 ++signum) { | 750 ++signum) { |
751 if (PosixSignalHandler::Instance()->IsSignalSet(signum)) { | 751 if (PosixSignalHandler::Instance()->IsSignalSet(signum)) { |
752 PosixSignalHandler::Instance()->ClearSignal(signum); | 752 PosixSignalHandler::Instance()->ClearSignal(signum); |
753 HandlerMap::iterator i = handlers_.find(signum); | 753 HandlerMap::iterator i = handlers_.find(signum); |
754 if (i == handlers_.end()) { | 754 if (i == handlers_.end()) { |
755 // This can happen if a signal is delivered to our process at around | 755 // This can happen if a signal is delivered to our process at around |
756 // the same time as we unset our handler for it. It is not an error | 756 // the same time as we unset our handler for it. It is not an error |
757 // condition, but it's unusual enough to be worth logging. | 757 // condition, but it's unusual enough to be worth logging. |
758 LOG(LS_INFO) << "Received signal with no handler: " << signum; | 758 LOG(LS_INFO) << "Received signal with no handler: " << signum; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
849 // it's not necessary a problem if we spuriously interpret a | 849 // it's not necessary a problem if we spuriously interpret a |
850 // "connection lost"-type error as a blocking error, because typically | 850 // "connection lost"-type error as a blocking error, because typically |
851 // the next recv() will get EOF, so we'll still eventually notice that | 851 // the next recv() will get EOF, so we'll still eventually notice that |
852 // the socket is closed. | 852 // the socket is closed. |
853 LOG_ERR(LS_WARNING) << "Assuming benign blocking error"; | 853 LOG_ERR(LS_WARNING) << "Assuming benign blocking error"; |
854 return false; | 854 return false; |
855 } | 855 } |
856 } | 856 } |
857 } | 857 } |
858 | 858 |
859 uint32 GetRequestedEvents() override { return enabled_events_; } | 859 uint32_t GetRequestedEvents() override { return enabled_events_; } |
860 | 860 |
861 void OnPreEvent(uint32 ff) override { | 861 void OnPreEvent(uint32_t ff) override { |
862 if ((ff & DE_CONNECT) != 0) | 862 if ((ff & DE_CONNECT) != 0) |
863 state_ = CS_CONNECTED; | 863 state_ = CS_CONNECTED; |
864 if ((ff & DE_CLOSE) != 0) | 864 if ((ff & DE_CLOSE) != 0) |
865 state_ = CS_CLOSED; | 865 state_ = CS_CLOSED; |
866 } | 866 } |
867 | 867 |
868 void OnEvent(uint32 ff, int err) override { | 868 void OnEvent(uint32_t ff, int err) override { |
869 // Make sure we deliver connect/accept first. Otherwise, consumers may see | 869 // Make sure we deliver connect/accept first. Otherwise, consumers may see |
870 // something like a READ followed by a CONNECT, which would be odd. | 870 // something like a READ followed by a CONNECT, which would be odd. |
871 if ((ff & DE_CONNECT) != 0) { | 871 if ((ff & DE_CONNECT) != 0) { |
872 enabled_events_ &= ~DE_CONNECT; | 872 enabled_events_ &= ~DE_CONNECT; |
873 SignalConnectEvent(this); | 873 SignalConnectEvent(this); |
874 } | 874 } |
875 if ((ff & DE_ACCEPT) != 0) { | 875 if ((ff & DE_ACCEPT) != 0) { |
876 enabled_events_ &= ~DE_ACCEPT; | 876 enabled_events_ &= ~DE_ACCEPT; |
877 SignalReadEvent(this); | 877 SignalReadEvent(this); |
878 } | 878 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 ~FileDispatcher() override { | 913 ~FileDispatcher() override { |
914 ss_->Remove(this); | 914 ss_->Remove(this); |
915 } | 915 } |
916 | 916 |
917 SocketServer* socketserver() { return ss_; } | 917 SocketServer* socketserver() { return ss_; } |
918 | 918 |
919 int GetDescriptor() override { return fd_; } | 919 int GetDescriptor() override { return fd_; } |
920 | 920 |
921 bool IsDescriptorClosed() override { return false; } | 921 bool IsDescriptorClosed() override { return false; } |
922 | 922 |
923 uint32 GetRequestedEvents() override { return flags_; } | 923 uint32_t GetRequestedEvents() override { return flags_; } |
924 | 924 |
925 void OnPreEvent(uint32 ff) override {} | 925 void OnPreEvent(uint32_t ff) override {} |
926 | 926 |
927 void OnEvent(uint32 ff, int err) override { | 927 void OnEvent(uint32_t ff, int err) override { |
928 if ((ff & DE_READ) != 0) | 928 if ((ff & DE_READ) != 0) |
929 SignalReadEvent(this); | 929 SignalReadEvent(this); |
930 if ((ff & DE_WRITE) != 0) | 930 if ((ff & DE_WRITE) != 0) |
931 SignalWriteEvent(this); | 931 SignalWriteEvent(this); |
932 if ((ff & DE_CLOSE) != 0) | 932 if ((ff & DE_CLOSE) != 0) |
933 SignalCloseEvent(this, err); | 933 SignalCloseEvent(this, err); |
934 } | 934 } |
935 | 935 |
936 bool readable() override { return (flags_ & DE_READ) != 0; } | 936 bool readable() override { return (flags_ & DE_READ) != 0; } |
937 | 937 |
(...skipping 13 matching lines...) Expand all Loading... |
951 int flags_; | 951 int flags_; |
952 }; | 952 }; |
953 | 953 |
954 AsyncFile* PhysicalSocketServer::CreateFile(int fd) { | 954 AsyncFile* PhysicalSocketServer::CreateFile(int fd) { |
955 return new FileDispatcher(fd, this); | 955 return new FileDispatcher(fd, this); |
956 } | 956 } |
957 | 957 |
958 #endif // WEBRTC_POSIX | 958 #endif // WEBRTC_POSIX |
959 | 959 |
960 #if defined(WEBRTC_WIN) | 960 #if defined(WEBRTC_WIN) |
961 static uint32 FlagsToEvents(uint32 events) { | 961 static uint32_t FlagsToEvents(uint32_t events) { |
962 uint32 ffFD = FD_CLOSE; | 962 uint32_t ffFD = FD_CLOSE; |
963 if (events & DE_READ) | 963 if (events & DE_READ) |
964 ffFD |= FD_READ; | 964 ffFD |= FD_READ; |
965 if (events & DE_WRITE) | 965 if (events & DE_WRITE) |
966 ffFD |= FD_WRITE; | 966 ffFD |= FD_WRITE; |
967 if (events & DE_CONNECT) | 967 if (events & DE_CONNECT) |
968 ffFD |= FD_CONNECT; | 968 ffFD |= FD_CONNECT; |
969 if (events & DE_ACCEPT) | 969 if (events & DE_ACCEPT) |
970 ffFD |= FD_ACCEPT; | 970 ffFD |= FD_ACCEPT; |
971 return ffFD; | 971 return ffFD; |
972 } | 972 } |
(...skipping 13 matching lines...) Expand all Loading... |
986 WSACloseEvent(hev_); | 986 WSACloseEvent(hev_); |
987 hev_ = NULL; | 987 hev_ = NULL; |
988 } | 988 } |
989 } | 989 } |
990 | 990 |
991 virtual void Signal() { | 991 virtual void Signal() { |
992 if (hev_ != NULL) | 992 if (hev_ != NULL) |
993 WSASetEvent(hev_); | 993 WSASetEvent(hev_); |
994 } | 994 } |
995 | 995 |
996 virtual uint32 GetRequestedEvents() { | 996 virtual uint32_t GetRequestedEvents() { return 0; } |
997 return 0; | |
998 } | |
999 | 997 |
1000 virtual void OnPreEvent(uint32 ff) { | 998 virtual void OnPreEvent(uint32_t ff) { WSAResetEvent(hev_); } |
1001 WSAResetEvent(hev_); | |
1002 } | |
1003 | 999 |
1004 virtual void OnEvent(uint32 ff, int err) { | 1000 virtual void OnEvent(uint32_t ff, int err) {} |
1005 } | |
1006 | 1001 |
1007 virtual WSAEVENT GetWSAEvent() { | 1002 virtual WSAEVENT GetWSAEvent() { |
1008 return hev_; | 1003 return hev_; |
1009 } | 1004 } |
1010 | 1005 |
1011 virtual SOCKET GetSocket() { | 1006 virtual SOCKET GetSocket() { |
1012 return INVALID_SOCKET; | 1007 return INVALID_SOCKET; |
1013 } | 1008 } |
1014 | 1009 |
1015 virtual bool CheckSignalClose() { return false; } | 1010 virtual bool CheckSignalClose() { return false; } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1070 virtual int Close() { | 1065 virtual int Close() { |
1071 if (s_ == INVALID_SOCKET) | 1066 if (s_ == INVALID_SOCKET) |
1072 return 0; | 1067 return 0; |
1073 | 1068 |
1074 id_ = 0; | 1069 id_ = 0; |
1075 signal_close_ = false; | 1070 signal_close_ = false; |
1076 ss_->Remove(this); | 1071 ss_->Remove(this); |
1077 return PhysicalSocket::Close(); | 1072 return PhysicalSocket::Close(); |
1078 } | 1073 } |
1079 | 1074 |
1080 virtual uint32 GetRequestedEvents() { | 1075 virtual uint32_t GetRequestedEvents() { return enabled_events_; } |
1081 return enabled_events_; | |
1082 } | |
1083 | 1076 |
1084 virtual void OnPreEvent(uint32 ff) { | 1077 virtual void OnPreEvent(uint32_t ff) { |
1085 if ((ff & DE_CONNECT) != 0) | 1078 if ((ff & DE_CONNECT) != 0) |
1086 state_ = CS_CONNECTED; | 1079 state_ = CS_CONNECTED; |
1087 // We set CS_CLOSED from CheckSignalClose. | 1080 // We set CS_CLOSED from CheckSignalClose. |
1088 } | 1081 } |
1089 | 1082 |
1090 virtual void OnEvent(uint32 ff, int err) { | 1083 virtual void OnEvent(uint32_t ff, int err) { |
1091 int cache_id = id_; | 1084 int cache_id = id_; |
1092 // Make sure we deliver connect/accept first. Otherwise, consumers may see | 1085 // Make sure we deliver connect/accept first. Otherwise, consumers may see |
1093 // something like a READ followed by a CONNECT, which would be odd. | 1086 // something like a READ followed by a CONNECT, which would be odd. |
1094 if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) { | 1087 if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) { |
1095 if (ff != DE_CONNECT) | 1088 if (ff != DE_CONNECT) |
1096 LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff; | 1089 LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff; |
1097 enabled_events_ &= ~DE_CONNECT; | 1090 enabled_events_ &= ~DE_CONNECT; |
1098 #ifdef _DEBUG | 1091 #ifdef _DEBUG |
1099 dbg_addr_ = "Connected @ "; | 1092 dbg_addr_ = "Connected @ "; |
1100 dbg_addr_.append(GetRemoteAddress().ToString()); | 1093 dbg_addr_.append(GetRemoteAddress().ToString()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 #endif // WEBRTC_WIN | 1140 #endif // WEBRTC_WIN |
1148 | 1141 |
1149 // Sets the value of a boolean value to false when signaled. | 1142 // Sets the value of a boolean value to false when signaled. |
1150 class Signaler : public EventDispatcher { | 1143 class Signaler : public EventDispatcher { |
1151 public: | 1144 public: |
1152 Signaler(PhysicalSocketServer* ss, bool* pf) | 1145 Signaler(PhysicalSocketServer* ss, bool* pf) |
1153 : EventDispatcher(ss), pf_(pf) { | 1146 : EventDispatcher(ss), pf_(pf) { |
1154 } | 1147 } |
1155 ~Signaler() override { } | 1148 ~Signaler() override { } |
1156 | 1149 |
1157 void OnEvent(uint32 ff, int err) override { | 1150 void OnEvent(uint32_t ff, int err) override { |
1158 if (pf_) | 1151 if (pf_) |
1159 *pf_ = false; | 1152 *pf_ = false; |
1160 } | 1153 } |
1161 | 1154 |
1162 private: | 1155 private: |
1163 bool *pf_; | 1156 bool *pf_; |
1164 }; | 1157 }; |
1165 | 1158 |
1166 PhysicalSocketServer::PhysicalSocketServer() | 1159 PhysicalSocketServer::PhysicalSocketServer() |
1167 : fWait_(false) { | 1160 : fWait_(false) { |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 for (size_t i = 0; i < dispatchers_.size(); ++i) { | 1298 for (size_t i = 0; i < dispatchers_.size(); ++i) { |
1306 // Query dispatchers for read and write wait state | 1299 // Query dispatchers for read and write wait state |
1307 Dispatcher *pdispatcher = dispatchers_[i]; | 1300 Dispatcher *pdispatcher = dispatchers_[i]; |
1308 ASSERT(pdispatcher); | 1301 ASSERT(pdispatcher); |
1309 if (!process_io && (pdispatcher != signal_wakeup_)) | 1302 if (!process_io && (pdispatcher != signal_wakeup_)) |
1310 continue; | 1303 continue; |
1311 int fd = pdispatcher->GetDescriptor(); | 1304 int fd = pdispatcher->GetDescriptor(); |
1312 if (fd > fdmax) | 1305 if (fd > fdmax) |
1313 fdmax = fd; | 1306 fdmax = fd; |
1314 | 1307 |
1315 uint32 ff = pdispatcher->GetRequestedEvents(); | 1308 uint32_t ff = pdispatcher->GetRequestedEvents(); |
1316 if (ff & (DE_READ | DE_ACCEPT)) | 1309 if (ff & (DE_READ | DE_ACCEPT)) |
1317 FD_SET(fd, &fdsRead); | 1310 FD_SET(fd, &fdsRead); |
1318 if (ff & (DE_WRITE | DE_CONNECT)) | 1311 if (ff & (DE_WRITE | DE_CONNECT)) |
1319 FD_SET(fd, &fdsWrite); | 1312 FD_SET(fd, &fdsWrite); |
1320 } | 1313 } |
1321 } | 1314 } |
1322 | 1315 |
1323 // Wait then call handlers as appropriate | 1316 // Wait then call handlers as appropriate |
1324 // < 0 means error | 1317 // < 0 means error |
1325 // 0 means timeout | 1318 // 0 means timeout |
(...skipping 12 matching lines...) Expand all Loading... |
1338 // iteration. | 1331 // iteration. |
1339 } else if (n == 0) { | 1332 } else if (n == 0) { |
1340 // If timeout, return success | 1333 // If timeout, return success |
1341 return true; | 1334 return true; |
1342 } else { | 1335 } else { |
1343 // We have signaled descriptors | 1336 // We have signaled descriptors |
1344 CritScope cr(&crit_); | 1337 CritScope cr(&crit_); |
1345 for (size_t i = 0; i < dispatchers_.size(); ++i) { | 1338 for (size_t i = 0; i < dispatchers_.size(); ++i) { |
1346 Dispatcher *pdispatcher = dispatchers_[i]; | 1339 Dispatcher *pdispatcher = dispatchers_[i]; |
1347 int fd = pdispatcher->GetDescriptor(); | 1340 int fd = pdispatcher->GetDescriptor(); |
1348 uint32 ff = 0; | 1341 uint32_t ff = 0; |
1349 int errcode = 0; | 1342 int errcode = 0; |
1350 | 1343 |
1351 // Reap any error code, which can be signaled through reads or writes. | 1344 // Reap any error code, which can be signaled through reads or writes. |
1352 // TODO: Should we set errcode if getsockopt fails? | 1345 // TODO: Should we set errcode if getsockopt fails? |
1353 if (FD_ISSET(fd, &fdsRead) || FD_ISSET(fd, &fdsWrite)) { | 1346 if (FD_ISSET(fd, &fdsRead) || FD_ISSET(fd, &fdsWrite)) { |
1354 socklen_t len = sizeof(errcode); | 1347 socklen_t len = sizeof(errcode); |
1355 ::getsockopt(fd, SOL_SOCKET, SO_ERROR, &errcode, &len); | 1348 ::getsockopt(fd, SOL_SOCKET, SO_ERROR, &errcode, &len); |
1356 } | 1349 } |
1357 | 1350 |
1358 // Check readable descriptors. If we're waiting on an accept, signal | 1351 // Check readable descriptors. If we're waiting on an accept, signal |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1472 return false; | 1465 return false; |
1473 } | 1466 } |
1474 return true; | 1467 return true; |
1475 } | 1468 } |
1476 #endif // WEBRTC_POSIX | 1469 #endif // WEBRTC_POSIX |
1477 | 1470 |
1478 #if defined(WEBRTC_WIN) | 1471 #if defined(WEBRTC_WIN) |
1479 bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) { | 1472 bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) { |
1480 int cmsTotal = cmsWait; | 1473 int cmsTotal = cmsWait; |
1481 int cmsElapsed = 0; | 1474 int cmsElapsed = 0; |
1482 uint32 msStart = Time(); | 1475 uint32_t msStart = Time(); |
1483 | 1476 |
1484 fWait_ = true; | 1477 fWait_ = true; |
1485 while (fWait_) { | 1478 while (fWait_) { |
1486 std::vector<WSAEVENT> events; | 1479 std::vector<WSAEVENT> events; |
1487 std::vector<Dispatcher *> event_owners; | 1480 std::vector<Dispatcher *> event_owners; |
1488 | 1481 |
1489 events.push_back(socket_ev_); | 1482 events.push_back(socket_ev_); |
1490 | 1483 |
1491 { | 1484 { |
1492 CritScope cr(&crit_); | 1485 CritScope cr(&crit_); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1583 LOG(WARNING) << "PhysicalSocketServer got FD_ACCEPT_BIT error " | 1576 LOG(WARNING) << "PhysicalSocketServer got FD_ACCEPT_BIT error " |
1584 << wsaEvents.iErrorCode[FD_ACCEPT_BIT]; | 1577 << wsaEvents.iErrorCode[FD_ACCEPT_BIT]; |
1585 } | 1578 } |
1586 if ((wsaEvents.lNetworkEvents & FD_CLOSE) && | 1579 if ((wsaEvents.lNetworkEvents & FD_CLOSE) && |
1587 wsaEvents.iErrorCode[FD_CLOSE_BIT] != 0) { | 1580 wsaEvents.iErrorCode[FD_CLOSE_BIT] != 0) { |
1588 LOG(WARNING) << "PhysicalSocketServer got FD_CLOSE_BIT error " | 1581 LOG(WARNING) << "PhysicalSocketServer got FD_CLOSE_BIT error " |
1589 << wsaEvents.iErrorCode[FD_CLOSE_BIT]; | 1582 << wsaEvents.iErrorCode[FD_CLOSE_BIT]; |
1590 } | 1583 } |
1591 } | 1584 } |
1592 #endif | 1585 #endif |
1593 uint32 ff = 0; | 1586 uint32_t ff = 0; |
1594 int errcode = 0; | 1587 int errcode = 0; |
1595 if (wsaEvents.lNetworkEvents & FD_READ) | 1588 if (wsaEvents.lNetworkEvents & FD_READ) |
1596 ff |= DE_READ; | 1589 ff |= DE_READ; |
1597 if (wsaEvents.lNetworkEvents & FD_WRITE) | 1590 if (wsaEvents.lNetworkEvents & FD_WRITE) |
1598 ff |= DE_WRITE; | 1591 ff |= DE_WRITE; |
1599 if (wsaEvents.lNetworkEvents & FD_CONNECT) { | 1592 if (wsaEvents.lNetworkEvents & FD_CONNECT) { |
1600 if (wsaEvents.iErrorCode[FD_CONNECT_BIT] == 0) { | 1593 if (wsaEvents.iErrorCode[FD_CONNECT_BIT] == 0) { |
1601 ff |= DE_CONNECT; | 1594 ff |= DE_CONNECT; |
1602 } else { | 1595 } else { |
1603 ff |= DE_CLOSE; | 1596 ff |= DE_CLOSE; |
(...skipping 30 matching lines...) Expand all Loading... |
1634 break; | 1627 break; |
1635 } | 1628 } |
1636 } | 1629 } |
1637 | 1630 |
1638 // Done | 1631 // Done |
1639 return true; | 1632 return true; |
1640 } | 1633 } |
1641 #endif // WEBRTC_WIN | 1634 #endif // WEBRTC_WIN |
1642 | 1635 |
1643 } // namespace rtc | 1636 } // namespace rtc |
OLD | NEW |