diff options
Diffstat (limited to 'net/base/client_socket_handle.cc')
-rw-r--r-- | net/base/client_socket_handle.cc | 51 |
1 files changed, 42 insertions, 9 deletions
diff --git a/net/base/client_socket_handle.cc b/net/base/client_socket_handle.cc index f5ab056..396fe32 100644 --- a/net/base/client_socket_handle.cc +++ b/net/base/client_socket_handle.cc @@ -4,37 +4,70 @@ #include "net/base/client_socket_handle.h" +#include "base/compiler_specific.h" #include "net/base/client_socket.h" #include "net/base/client_socket_pool.h" +#include "net/base/net_errors.h" namespace net { ClientSocketHandle::ClientSocketHandle(ClientSocketPool* pool) - : pool_(pool), socket_(NULL) { -} + : pool_(pool), + socket_(NULL), + is_reused_(false), + ALLOW_THIS_IN_INITIALIZER_LIST( + callback_(this, &ClientSocketHandle::OnIOComplete)) {} ClientSocketHandle::~ClientSocketHandle() { Reset(); } int ClientSocketHandle::Init(const std::string& group_name, + const std::string& host, + int port, int priority, CompletionCallback* callback) { - Reset(); + ResetInternal(true); group_name_ = group_name; - return pool_->RequestSocket(this, priority, callback); + user_callback_ = callback; + return pool_->RequestSocket( + group_name, host, port, priority, this, &callback_); } void ClientSocketHandle::Reset() { + ResetInternal(true); +} + +void ClientSocketHandle::ResetInternal(bool cancel) { if (group_name_.empty()) // Was Init called? return; - if (socket_) { - pool_->ReleaseSocket(this); - socket_ = NULL; - } else { - pool_->CancelRequest(this); + if (socket_.get()) { + // If we've still got a socket, release it back to the ClientSocketPool so + // it can be deleted or reused. + pool_->ReleaseSocket(group_name_, release_socket()); + } else if (cancel) { + // If we did not get initialized yet, so we've got a socket request pending. + // Cancel it. + pool_->CancelRequest(group_name_, this); } group_name_.clear(); + is_reused_ = false; + user_callback_ = NULL; +} + +LoadState ClientSocketHandle::GetLoadState() const { + DCHECK(!is_initialized()); + DCHECK(!group_name_.empty()); + return pool_->GetLoadState(group_name_, this); +} + +void ClientSocketHandle::OnIOComplete(int result) { + DCHECK_NE(ERR_IO_PENDING, result); + CompletionCallback* callback = user_callback_; + user_callback_ = NULL; + if (result != OK) + ResetInternal(false); // The request failed, so there's nothing to cancel. + callback->Run(result); } } // namespace net |