| Index: webrtc/base/socketpool.h | 
| diff --git a/webrtc/base/socketpool.h b/webrtc/base/socketpool.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..5ceab203dc28c7c318a627e4ae6ef4b42bfc8aef | 
| --- /dev/null | 
| +++ b/webrtc/base/socketpool.h | 
| @@ -0,0 +1,143 @@ | 
| +/* | 
| + *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
| + * | 
| + *  Use of this source code is governed by a BSD-style license | 
| + *  that can be found in the LICENSE file in the root of the source | 
| + *  tree. An additional intellectual property rights grant can be found | 
| + *  in the file PATENTS.  All contributing project authors may | 
| + *  be found in the AUTHORS file in the root of the source tree. | 
| + */ | 
| + | 
| +#ifndef WEBRTC_BASE_SOCKETPOOL_H_ | 
| +#define WEBRTC_BASE_SOCKETPOOL_H_ | 
| + | 
| +#include <deque> | 
| +#include <list> | 
| +#include "webrtc/base/logging.h" | 
| +#include "webrtc/base/sigslot.h" | 
| +#include "webrtc/base/socketaddress.h" | 
| + | 
| +namespace rtc { | 
| + | 
| +class AsyncSocket; | 
| +class LoggingAdapter; | 
| +class SocketFactory; | 
| +class SocketStream; | 
| +class StreamInterface; | 
| + | 
| +////////////////////////////////////////////////////////////////////// | 
| +// StreamPool | 
| +////////////////////////////////////////////////////////////////////// | 
| + | 
| +class StreamPool { | 
| +public: | 
| +  virtual ~StreamPool() { } | 
| + | 
| +  virtual StreamInterface* RequestConnectedStream(const SocketAddress& remote, | 
| +                                                  int* err) = 0; | 
| +  virtual void ReturnConnectedStream(StreamInterface* stream) = 0; | 
| +}; | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// StreamCache - Caches a set of open streams, defers creation/destruction to | 
| +//  the supplied StreamPool. | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +class StreamCache : public StreamPool, public sigslot::has_slots<> { | 
| +public: | 
| +  StreamCache(StreamPool* pool); | 
| +  ~StreamCache() override; | 
| + | 
| +  // StreamPool Interface | 
| +  StreamInterface* RequestConnectedStream(const SocketAddress& remote, | 
| +                                          int* err) override; | 
| +  void ReturnConnectedStream(StreamInterface* stream) override; | 
| + | 
| +private: | 
| +  typedef std::pair<SocketAddress, StreamInterface*> ConnectedStream; | 
| +  typedef std::list<ConnectedStream> ConnectedList; | 
| + | 
| +  void OnStreamEvent(StreamInterface* stream, int events, int err); | 
| + | 
| +  // We delegate stream creation and deletion to this pool. | 
| +  StreamPool* pool_; | 
| +  // Streams that are in use (returned from RequestConnectedStream). | 
| +  ConnectedList active_; | 
| +  // Streams which were returned to us, but are still open. | 
| +  ConnectedList cached_; | 
| +}; | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// NewSocketPool | 
| +// Creates a new stream on every request | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +class NewSocketPool : public StreamPool { | 
| +public: | 
| +  NewSocketPool(SocketFactory* factory); | 
| +  ~NewSocketPool() override; | 
| + | 
| +  // StreamPool Interface | 
| +  StreamInterface* RequestConnectedStream(const SocketAddress& remote, | 
| +                                          int* err) override; | 
| +  void ReturnConnectedStream(StreamInterface* stream) override; | 
| + | 
| +private: | 
| +  SocketFactory* factory_; | 
| +}; | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// ReuseSocketPool | 
| +// Maintains a single socket at a time, and will reuse it without closing if | 
| +// the destination address is the same. | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +class ReuseSocketPool : public StreamPool, public sigslot::has_slots<> { | 
| +public: | 
| +  ReuseSocketPool(SocketFactory* factory); | 
| +  ~ReuseSocketPool() override; | 
| + | 
| +  // StreamPool Interface | 
| +  StreamInterface* RequestConnectedStream(const SocketAddress& remote, | 
| +                                          int* err) override; | 
| +  void ReturnConnectedStream(StreamInterface* stream) override; | 
| + | 
| +private: | 
| +  void OnStreamEvent(StreamInterface* stream, int events, int err); | 
| + | 
| +  SocketFactory* factory_; | 
| +  SocketStream* stream_; | 
| +  SocketAddress remote_; | 
| +  bool checked_out_;  // Whether the stream is currently checked out | 
| +}; | 
| + | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| +// LoggingPoolAdapter - Adapts a StreamPool to supply streams with attached | 
| +// LoggingAdapters. | 
| +/////////////////////////////////////////////////////////////////////////////// | 
| + | 
| +class LoggingPoolAdapter : public StreamPool { | 
| +public: | 
| +  LoggingPoolAdapter(StreamPool* pool, LoggingSeverity level, | 
| +                     const std::string& label, bool binary_mode); | 
| +  ~LoggingPoolAdapter() override; | 
| + | 
| +  // StreamPool Interface | 
| +  StreamInterface* RequestConnectedStream(const SocketAddress& remote, | 
| +                                          int* err) override; | 
| +  void ReturnConnectedStream(StreamInterface* stream) override; | 
| + | 
| +private: | 
| +  StreamPool* pool_; | 
| +  LoggingSeverity level_; | 
| +  std::string label_; | 
| +  bool binary_mode_; | 
| +  typedef std::deque<LoggingAdapter*> StreamList; | 
| +  StreamList recycle_bin_; | 
| +}; | 
| + | 
| +////////////////////////////////////////////////////////////////////// | 
| + | 
| +}  // namespace rtc | 
| + | 
| +#endif  // WEBRTC_BASE_SOCKETPOOL_H_ | 
|  |