OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
| 3 * |
| 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 |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 #ifndef WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ |
| 12 #define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ |
| 13 |
| 14 #include <winsock2.h> |
| 15 #include <list> |
| 16 |
| 17 #include "webrtc/system_wrappers/include/atomic32.h" |
| 18 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 19 #include "webrtc/system_wrappers/include/event_wrapper.h" |
| 20 #include "webrtc/base/platform_thread.h" |
| 21 #include "webrtc/test/channel_transport/udp_socket2_win.h" |
| 22 #include "webrtc/test/channel_transport/udp_socket_manager_wrapper.h" |
| 23 #include "webrtc/test/channel_transport/udp_transport.h" |
| 24 |
| 25 #define MAX_IO_BUFF_SIZE 1600 |
| 26 |
| 27 namespace webrtc { |
| 28 namespace test { |
| 29 |
| 30 enum IO_OPERATION { |
| 31 OP_READ, |
| 32 OP_WRITE |
| 33 }; |
| 34 |
| 35 class UdpSocket2Windows; |
| 36 |
| 37 // Struct used for all socket I/O operations. |
| 38 struct PerIoContext { |
| 39 WSAOVERLAPPED overlapped; |
| 40 char buffer[MAX_IO_BUFF_SIZE]; |
| 41 WSABUF wsabuf; |
| 42 size_t nTotalBytes; |
| 43 int nSentBytes; |
| 44 int bytes; |
| 45 IO_OPERATION ioOperation; |
| 46 SocketAddress from; |
| 47 int fromLen; |
| 48 // Should be set to true if the I/O context was passed to the system by |
| 49 // a thread not controlled by the socket implementation. |
| 50 bool ioInitiatedByPlatformThread; |
| 51 // TODO (hellner): Not used. Delete it. |
| 52 PerIoContext* pNextFree; |
| 53 }; |
| 54 |
| 55 struct IoContextPoolItem; |
| 56 struct IoContextPoolItemPayload |
| 57 { |
| 58 PerIoContext ioContext; |
| 59 IoContextPoolItem* base; |
| 60 }; |
| 61 |
| 62 struct IoContextPoolItem |
| 63 { |
| 64 // Atomic single linked list entry header. |
| 65 SLIST_ENTRY itemEntry; |
| 66 // Atomic single linked list payload |
| 67 IoContextPoolItemPayload payload; |
| 68 }; |
| 69 |
| 70 class IoContextPool |
| 71 { |
| 72 public: |
| 73 IoContextPool(); |
| 74 virtual ~IoContextPool(); |
| 75 virtual int32_t Init(uint32_t increaseSize = 128); |
| 76 // Re-use an old unused IO context or create a new one. |
| 77 virtual PerIoContext* PopIoContext(); |
| 78 virtual int32_t PushIoContext(PerIoContext* pIoContext); |
| 79 virtual inline int32_t GetSize(uint32_t* inUse = 0) |
| 80 {return _size.Value();} |
| 81 virtual int32_t Free(); |
| 82 private: |
| 83 // Sample code for use of msfts single linked atomic list can be found here: |
| 84 // http://msdn.microsoft.com/en-us/library/ms686962(VS.85).aspx |
| 85 |
| 86 // Atomic single linked list head. |
| 87 PSLIST_HEADER _pListHead; |
| 88 |
| 89 bool _init; |
| 90 Atomic32 _size; |
| 91 Atomic32 _inUse; |
| 92 }; |
| 93 |
| 94 class UdpSocket2WorkerWindows |
| 95 { |
| 96 public: |
| 97 UdpSocket2WorkerWindows(HANDLE ioCompletionHandle); |
| 98 virtual ~UdpSocket2WorkerWindows(); |
| 99 |
| 100 virtual bool Start(); |
| 101 virtual bool Stop(); |
| 102 virtual int32_t Init(); |
| 103 protected: |
| 104 static bool Run(void* obj); |
| 105 bool Process(); |
| 106 private: |
| 107 HANDLE _ioCompletionHandle; |
| 108 rtc::PlatformThread _pThread; |
| 109 static int32_t _numOfWorkers; |
| 110 int32_t _workerNumber; |
| 111 volatile bool _stop; |
| 112 bool _init; |
| 113 }; |
| 114 |
| 115 class UdpSocket2ManagerWindows : public UdpSocketManager |
| 116 { |
| 117 public: |
| 118 UdpSocket2ManagerWindows(); |
| 119 virtual ~UdpSocket2ManagerWindows(); |
| 120 |
| 121 virtual bool Init(int32_t id, uint8_t& numOfWorkThreads); |
| 122 |
| 123 virtual bool Start(); |
| 124 virtual bool Stop(); |
| 125 |
| 126 virtual inline bool AddSocket(UdpSocketWrapper* s) |
| 127 {if(s) return AddSocketPrv(reinterpret_cast<UdpSocket2Windows*>(s)); |
| 128 return false;} |
| 129 virtual bool RemoveSocket(UdpSocketWrapper* s) |
| 130 {if(s) return RemoveSocketPrv(reinterpret_cast<UdpSocket2Windows*>(s)); |
| 131 return false;} |
| 132 |
| 133 PerIoContext* PopIoContext(void); |
| 134 int32_t PushIoContext(PerIoContext* pIoContext); |
| 135 |
| 136 private: |
| 137 typedef std::list<UdpSocket2WorkerWindows*> WorkerList; |
| 138 bool StopWorkerThreads(); |
| 139 bool StartWorkerThreads(); |
| 140 bool AddSocketPrv(UdpSocket2Windows* s); |
| 141 bool RemoveSocketPrv(UdpSocket2Windows* s); |
| 142 |
| 143 static uint32_t _numOfActiveManagers; |
| 144 static bool _wsaInit; |
| 145 |
| 146 int32_t _id; |
| 147 CriticalSectionWrapper* _pCrit; |
| 148 int32_t _managerNumber; |
| 149 volatile bool _stopped; |
| 150 bool _init; |
| 151 int32_t _numActiveSockets; |
| 152 WorkerList _workerThreadsList; |
| 153 EventWrapper* _event; |
| 154 |
| 155 HANDLE _ioCompletionHandle; |
| 156 IoContextPool _ioContextPool; |
| 157 }; |
| 158 |
| 159 } // namespace test |
| 160 } // namespace webrtc |
| 161 |
| 162 #endif // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ |
OLD | NEW |