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