diff options
Diffstat (limited to 'webrtc/test/channel_transport/udp_socket2_manager_win.h')
-rw-r--r-- | webrtc/test/channel_transport/udp_socket2_manager_win.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/webrtc/test/channel_transport/udp_socket2_manager_win.h b/webrtc/test/channel_transport/udp_socket2_manager_win.h new file mode 100644 index 0000000000..c6af03a702 --- /dev/null +++ b/webrtc/test/channel_transport/udp_socket2_manager_win.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ +#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ + +#include <winsock2.h> +#include <list> + +#include "webrtc/system_wrappers/include/atomic32.h" +#include "webrtc/system_wrappers/include/critical_section_wrapper.h" +#include "webrtc/system_wrappers/include/event_wrapper.h" +#include "webrtc/system_wrappers/include/thread_wrapper.h" +#include "webrtc/test/channel_transport/udp_socket2_win.h" +#include "webrtc/test/channel_transport/udp_socket_manager_wrapper.h" +#include "webrtc/test/channel_transport/udp_transport.h" + +#define MAX_IO_BUFF_SIZE 1600 + +namespace webrtc { +namespace test { + +enum IO_OPERATION { + OP_READ, + OP_WRITE +}; + +class UdpSocket2Windows; + +// Struct used for all socket I/O operations. +struct PerIoContext { + WSAOVERLAPPED overlapped; + char buffer[MAX_IO_BUFF_SIZE]; + WSABUF wsabuf; + size_t nTotalBytes; + int nSentBytes; + int bytes; + IO_OPERATION ioOperation; + SocketAddress from; + int fromLen; + // Should be set to true if the I/O context was passed to the system by + // a thread not controlled by the socket implementation. + bool ioInitiatedByThreadWrapper; + // TODO (hellner): Not used. Delete it. + PerIoContext* pNextFree; +}; + +struct IoContextPoolItem; +struct IoContextPoolItemPayload +{ + PerIoContext ioContext; + IoContextPoolItem* base; +}; + +struct IoContextPoolItem +{ + // Atomic single linked list entry header. + SLIST_ENTRY itemEntry; + // Atomic single linked list payload + IoContextPoolItemPayload payload; +}; + +class IoContextPool +{ +public: + IoContextPool(); + virtual ~IoContextPool(); + virtual int32_t Init(uint32_t increaseSize = 128); + // Re-use an old unused IO context or create a new one. + virtual PerIoContext* PopIoContext(); + virtual int32_t PushIoContext(PerIoContext* pIoContext); + virtual inline int32_t GetSize(uint32_t* inUse = 0) + {return _size.Value();} + virtual int32_t Free(); +private: + // Sample code for use of msfts single linked atomic list can be found here: + // http://msdn.microsoft.com/en-us/library/ms686962(VS.85).aspx + + // Atomic single linked list head. + PSLIST_HEADER _pListHead; + + bool _init; + Atomic32 _size; + Atomic32 _inUse; +}; + +class UdpSocket2WorkerWindows +{ +public: + UdpSocket2WorkerWindows(HANDLE ioCompletionHandle); + virtual ~UdpSocket2WorkerWindows(); + + virtual bool Start(); + virtual bool Stop(); + virtual int32_t Init(); +protected: + static bool Run(void* obj); + bool Process(); +private: + HANDLE _ioCompletionHandle; + rtc::scoped_ptr<ThreadWrapper> _pThread; + static int32_t _numOfWorkers; + int32_t _workerNumber; + volatile bool _stop; + bool _init; +}; + +class UdpSocket2ManagerWindows : public UdpSocketManager +{ +public: + UdpSocket2ManagerWindows(); + virtual ~UdpSocket2ManagerWindows(); + + virtual bool Init(int32_t id, uint8_t& numOfWorkThreads); + + virtual bool Start(); + virtual bool Stop(); + + virtual inline bool AddSocket(UdpSocketWrapper* s) + {if(s) return AddSocketPrv(reinterpret_cast<UdpSocket2Windows*>(s)); + return false;} + virtual bool RemoveSocket(UdpSocketWrapper* s) + {if(s) return RemoveSocketPrv(reinterpret_cast<UdpSocket2Windows*>(s)); + return false;} + + PerIoContext* PopIoContext(void); + int32_t PushIoContext(PerIoContext* pIoContext); + +private: + typedef std::list<UdpSocket2WorkerWindows*> WorkerList; + bool StopWorkerThreads(); + bool StartWorkerThreads(); + bool AddSocketPrv(UdpSocket2Windows* s); + bool RemoveSocketPrv(UdpSocket2Windows* s); + + static uint32_t _numOfActiveManagers; + static bool _wsaInit; + + int32_t _id; + CriticalSectionWrapper* _pCrit; + int32_t _managerNumber; + volatile bool _stopped; + bool _init; + int32_t _numActiveSockets; + WorkerList _workerThreadsList; + EventWrapper* _event; + + HANDLE _ioCompletionHandle; + IoContextPool _ioContextPool; +}; + +} // namespace test +} // namespace webrtc + +#endif // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_SOCKET2_MANAGER_WINDOWS_H_ |