henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 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_SOCKETPOOL_H_ |
| 12 | #define WEBRTC_BASE_SOCKETPOOL_H_ |
| 13 | |
| 14 | #include <deque> |
| 15 | #include <list> |
| 16 | #include "webrtc/base/logging.h" |
| 17 | #include "webrtc/base/sigslot.h" |
| 18 | #include "webrtc/base/socketaddress.h" |
| 19 | |
| 20 | namespace rtc { |
| 21 | |
| 22 | class AsyncSocket; |
| 23 | class LoggingAdapter; |
| 24 | class SocketFactory; |
| 25 | class SocketStream; |
| 26 | class StreamInterface; |
| 27 | |
| 28 | ////////////////////////////////////////////////////////////////////// |
| 29 | // StreamPool |
| 30 | ////////////////////////////////////////////////////////////////////// |
| 31 | |
| 32 | class StreamPool { |
| 33 | public: |
| 34 | virtual ~StreamPool() { } |
| 35 | |
| 36 | virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, |
| 37 | int* err) = 0; |
| 38 | virtual void ReturnConnectedStream(StreamInterface* stream) = 0; |
| 39 | }; |
| 40 | |
| 41 | /////////////////////////////////////////////////////////////////////////////// |
| 42 | // StreamCache - Caches a set of open streams, defers creation/destruction to |
| 43 | // the supplied StreamPool. |
| 44 | /////////////////////////////////////////////////////////////////////////////// |
| 45 | |
| 46 | class StreamCache : public StreamPool, public sigslot::has_slots<> { |
| 47 | public: |
| 48 | StreamCache(StreamPool* pool); |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 49 | ~StreamCache() override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 50 | |
| 51 | // StreamPool Interface |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 52 | StreamInterface* RequestConnectedStream(const SocketAddress& remote, |
| 53 | int* err) override; |
| 54 | void ReturnConnectedStream(StreamInterface* stream) override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 55 | |
| 56 | private: |
| 57 | typedef std::pair<SocketAddress, StreamInterface*> ConnectedStream; |
| 58 | typedef std::list<ConnectedStream> ConnectedList; |
| 59 | |
| 60 | void OnStreamEvent(StreamInterface* stream, int events, int err); |
| 61 | |
| 62 | // We delegate stream creation and deletion to this pool. |
| 63 | StreamPool* pool_; |
| 64 | // Streams that are in use (returned from RequestConnectedStream). |
| 65 | ConnectedList active_; |
| 66 | // Streams which were returned to us, but are still open. |
| 67 | ConnectedList cached_; |
| 68 | }; |
| 69 | |
| 70 | /////////////////////////////////////////////////////////////////////////////// |
| 71 | // NewSocketPool |
| 72 | // Creates a new stream on every request |
| 73 | /////////////////////////////////////////////////////////////////////////////// |
| 74 | |
| 75 | class NewSocketPool : public StreamPool { |
| 76 | public: |
| 77 | NewSocketPool(SocketFactory* factory); |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 78 | ~NewSocketPool() override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 79 | |
| 80 | // StreamPool Interface |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 81 | StreamInterface* RequestConnectedStream(const SocketAddress& remote, |
| 82 | int* err) override; |
| 83 | void ReturnConnectedStream(StreamInterface* stream) override; |
| 84 | |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 85 | private: |
| 86 | SocketFactory* factory_; |
| 87 | }; |
| 88 | |
| 89 | /////////////////////////////////////////////////////////////////////////////// |
| 90 | // ReuseSocketPool |
| 91 | // Maintains a single socket at a time, and will reuse it without closing if |
| 92 | // the destination address is the same. |
| 93 | /////////////////////////////////////////////////////////////////////////////// |
| 94 | |
| 95 | class ReuseSocketPool : public StreamPool, public sigslot::has_slots<> { |
| 96 | public: |
| 97 | ReuseSocketPool(SocketFactory* factory); |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 98 | ~ReuseSocketPool() override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 99 | |
| 100 | // StreamPool Interface |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 101 | StreamInterface* RequestConnectedStream(const SocketAddress& remote, |
| 102 | int* err) override; |
| 103 | void ReturnConnectedStream(StreamInterface* stream) override; |
| 104 | |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 105 | private: |
| 106 | void OnStreamEvent(StreamInterface* stream, int events, int err); |
| 107 | |
| 108 | SocketFactory* factory_; |
| 109 | SocketStream* stream_; |
| 110 | SocketAddress remote_; |
| 111 | bool checked_out_; // Whether the stream is currently checked out |
| 112 | }; |
| 113 | |
| 114 | /////////////////////////////////////////////////////////////////////////////// |
| 115 | // LoggingPoolAdapter - Adapts a StreamPool to supply streams with attached |
| 116 | // LoggingAdapters. |
| 117 | /////////////////////////////////////////////////////////////////////////////// |
| 118 | |
| 119 | class LoggingPoolAdapter : public StreamPool { |
| 120 | public: |
| 121 | LoggingPoolAdapter(StreamPool* pool, LoggingSeverity level, |
| 122 | const std::string& label, bool binary_mode); |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 123 | ~LoggingPoolAdapter() override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 124 | |
| 125 | // StreamPool Interface |
kwiberg@webrtc.org | 786b634 | 2015-03-09 22:21:53 | [diff] [blame] | 126 | StreamInterface* RequestConnectedStream(const SocketAddress& remote, |
| 127 | int* err) override; |
| 128 | void ReturnConnectedStream(StreamInterface* stream) override; |
henrike@webrtc.org | 47be73b | 2014-05-13 18:00:26 | [diff] [blame] | 129 | |
| 130 | private: |
| 131 | StreamPool* pool_; |
| 132 | LoggingSeverity level_; |
| 133 | std::string label_; |
| 134 | bool binary_mode_; |
| 135 | typedef std::deque<LoggingAdapter*> StreamList; |
| 136 | StreamList recycle_bin_; |
| 137 | }; |
| 138 | |
| 139 | ////////////////////////////////////////////////////////////////////// |
| 140 | |
| 141 | } // namespace rtc |
| 142 | |
| 143 | #endif // WEBRTC_BASE_SOCKETPOOL_H_ |