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