147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector> 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/asyncfile.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketserver.h" 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/criticalsection.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgtypedef int SOCKET; 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_POSIX 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Event constants for the Dispatcher class. 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgenum DispatcherEvent { 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DE_READ = 0x0001, 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DE_WRITE = 0x0002, 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DE_CONNECT = 0x0004, 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DE_CLOSE = 0x0008, 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DE_ACCEPT = 0x0010, 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Signaler; 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PosixSignalDispatcher; 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass Dispatcher { 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~Dispatcher() {} 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual uint32 GetRequestedEvents() = 0; 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnPreEvent(uint32 ff) = 0; 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnEvent(uint32 ff, int err) = 0; 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual WSAEVENT GetWSAEvent() = 0; 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual SOCKET GetSocket() = 0; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool CheckSignalClose() = 0; 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#elif defined(WEBRTC_POSIX) 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual int GetDescriptor() = 0; 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool IsDescriptorClosed() = 0; 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// A socket server that provides the real sockets of the underlying OS. 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass PhysicalSocketServer : public SocketServer { 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org PhysicalSocketServer(); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual ~PhysicalSocketServer(); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // SocketFactory: 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual Socket* CreateSocket(int type); 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual Socket* CreateSocket(int family, int type); 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual AsyncSocket* CreateAsyncSocket(int type); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual AsyncSocket* CreateAsyncSocket(int family, int type); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Internal Factory for Accept 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncSocket* WrapSocket(SOCKET s); 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // SocketServer: 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool Wait(int cms, bool process_io); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void WakeUp(); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Add(Dispatcher* dispatcher); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void Remove(Dispatcher* dispatcher); 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org AsyncFile* CreateFile(int fd); 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Sets the function to be executed in response to the specified POSIX signal. 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The function is executed from inside Wait() using the "self-pipe trick"-- 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // regardless of which thread receives the signal--and hence can safely 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // manipulate user-level data structures. 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // with signal(2). 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Only one PhysicalSocketServer should have user-level signal handlers. 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Dispatching signals on multiple PhysicalSocketServers is not reliable. 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // The signal mask is not modified. It is the caller's responsibily to 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // maintain it as desired. 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual bool SetPosixSignalHandler(int signum, void (*handler)(int)); 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Dispatcher* signal_dispatcher(); 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::vector<Dispatcher*> DispatcherList; 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org typedef std::vector<size_t*> IteratorList; 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static bool InstallSignal(int signum, void (*handler)(int)); 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<PosixSignalDispatcher> signal_dispatcher_; 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org DispatcherList dispatchers_; 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org IteratorList iterators_; 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Signaler* signal_wakeup_; 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org CriticalSection crit_; 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool fWait_; 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN) 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WSAEVENT socket_ev_; 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_PHYSICALSOCKETSERVER_H__ 121