// Copyright 2024 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_SOCKET_STREAM_SOCKET_HANDLE_H_ #define NET_SOCKET_STREAM_SOCKET_HANDLE_H_ #include #include #include "net/base/load_timing_info.h" #include "net/base/net_export.h" namespace net { class StreamSocket; class HigherLayeredPool; // A base class for handles that contain a StreamSocket. A subclass may have a // concept of initialization, where a handle needs to be initialized before it // can be used. A handle can be deinitialized by calling Reset(). class NET_EXPORT_PRIVATE StreamSocketHandle { public: enum class SocketReuseType { kUnused = 0, // unused socket that just finished connecting kUnusedIdle, // unused socket that has been idle for awhile kReusedIdle, // previously used socket kNumTypes, }; StreamSocketHandle(); StreamSocketHandle(const StreamSocketHandle&) = delete; StreamSocketHandle& operator=(const StreamSocketHandle&) = delete; virtual ~StreamSocketHandle(); // Returns true when `this` is initialized successfully. bool is_initialized() const { return is_initialized_; } StreamSocket* socket() { return socket_.get(); } StreamSocket* socket() const { return socket_.get(); } // Sets `socket` to `this`. void SetSocket(std::unique_ptr socket); // Releases the ownership of `socket`. std::unique_ptr PassSocket(); // Sets the portion of LoadTimingInfo related to connection establishment, and // the socket id. `is_reused` is needed because the handle may not have full // reuse information. `load_timing_info` must have all default values when // called. Returns false and makes no changes to `load_timing_info` when // `socket_` is nullptr. bool GetLoadTimingInfo(bool is_reused, LoadTimingInfo* load_timing_info) const; SocketReuseType reuse_type() const { return reuse_type_; } void set_reuse_type(SocketReuseType reuse_type) { reuse_type_ = reuse_type; } const LoadTimingInfo::ConnectTiming& connect_timing() const { return connect_timing_; } void set_connect_timing(const LoadTimingInfo::ConnectTiming& connect_timing) { connect_timing_ = connect_timing; } // If this handle is associated with a pool that has the concept of higher // layered pools, adds/removes a higher layered pool to the pool. Otherwise, // does nothing. virtual void AddHigherLayeredPool(HigherLayeredPool* higher_pool); virtual void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool); // Releases the underlying socket and uninitializes `this`. virtual void Reset() = 0; // Returns true if the pool that is associated with this handle is stalled. virtual bool IsPoolStalled() const = 0; protected: void set_is_initialized(bool is_initialized) { is_initialized_ = is_initialized; } private: bool is_initialized_ = false; std::unique_ptr socket_; SocketReuseType reuse_type_ = SocketReuseType::kUnused; // Timing information is set when a connection is successfully established. LoadTimingInfo::ConnectTiming connect_timing_; }; } // namespace net #endif // NET_SOCKET_STREAM_SOCKET_HANDLE_H_