1/* 2 * Copyright 2004 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_BASE_PHYSICALSOCKETSERVER_H__ 12#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 13 14#include <vector> 15 16#include "webrtc/base/asyncfile.h" 17#include "webrtc/base/scoped_ptr.h" 18#include "webrtc/base/socketserver.h" 19#include "webrtc/base/criticalsection.h" 20 21#if defined(WEBRTC_POSIX) 22typedef int SOCKET; 23#endif // WEBRTC_POSIX 24 25namespace rtc { 26 27// Event constants for the Dispatcher class. 28enum DispatcherEvent { 29 DE_READ = 0x0001, 30 DE_WRITE = 0x0002, 31 DE_CONNECT = 0x0004, 32 DE_CLOSE = 0x0008, 33 DE_ACCEPT = 0x0010, 34}; 35 36class Signaler; 37#if defined(WEBRTC_POSIX) 38class PosixSignalDispatcher; 39#endif 40 41class Dispatcher { 42 public: 43 virtual ~Dispatcher() {} 44 virtual uint32 GetRequestedEvents() = 0; 45 virtual void OnPreEvent(uint32 ff) = 0; 46 virtual void OnEvent(uint32 ff, int err) = 0; 47#if defined(WEBRTC_WIN) 48 virtual WSAEVENT GetWSAEvent() = 0; 49 virtual SOCKET GetSocket() = 0; 50 virtual bool CheckSignalClose() = 0; 51#elif defined(WEBRTC_POSIX) 52 virtual int GetDescriptor() = 0; 53 virtual bool IsDescriptorClosed() = 0; 54#endif 55}; 56 57// A socket server that provides the real sockets of the underlying OS. 58class PhysicalSocketServer : public SocketServer { 59 public: 60 PhysicalSocketServer(); 61 virtual ~PhysicalSocketServer(); 62 63 // SocketFactory: 64 virtual Socket* CreateSocket(int type); 65 virtual Socket* CreateSocket(int family, int type); 66 67 virtual AsyncSocket* CreateAsyncSocket(int type); 68 virtual AsyncSocket* CreateAsyncSocket(int family, int type); 69 70 // Internal Factory for Accept 71 AsyncSocket* WrapSocket(SOCKET s); 72 73 // SocketServer: 74 virtual bool Wait(int cms, bool process_io); 75 virtual void WakeUp(); 76 77 void Add(Dispatcher* dispatcher); 78 void Remove(Dispatcher* dispatcher); 79 80#if defined(WEBRTC_POSIX) 81 AsyncFile* CreateFile(int fd); 82 83 // Sets the function to be executed in response to the specified POSIX signal. 84 // The function is executed from inside Wait() using the "self-pipe trick"-- 85 // regardless of which thread receives the signal--and hence can safely 86 // manipulate user-level data structures. 87 // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like 88 // with signal(2). 89 // Only one PhysicalSocketServer should have user-level signal handlers. 90 // Dispatching signals on multiple PhysicalSocketServers is not reliable. 91 // The signal mask is not modified. It is the caller's responsibily to 92 // maintain it as desired. 93 virtual bool SetPosixSignalHandler(int signum, void (*handler)(int)); 94 95 protected: 96 Dispatcher* signal_dispatcher(); 97#endif 98 99 private: 100 typedef std::vector<Dispatcher*> DispatcherList; 101 typedef std::vector<size_t*> IteratorList; 102 103#if defined(WEBRTC_POSIX) 104 static bool InstallSignal(int signum, void (*handler)(int)); 105 106 scoped_ptr<PosixSignalDispatcher> signal_dispatcher_; 107#endif 108 DispatcherList dispatchers_; 109 IteratorList iterators_; 110 Signaler* signal_wakeup_; 111 CriticalSection crit_; 112 bool fWait_; 113#if defined(WEBRTC_WIN) 114 WSAEVENT socket_ev_; 115#endif 116}; 117 118} // namespace rtc 119 120#endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 121