Index: net/socket/websocket_endpoint_lock_manager.cc |
diff --git a/net/socket/websocket_endpoint_lock_manager.cc b/net/socket/websocket_endpoint_lock_manager.cc |
deleted file mode 100644 |
index 1bccb1df36be0fce33cc24ae54d146e57586e31e..0000000000000000000000000000000000000000 |
--- a/net/socket/websocket_endpoint_lock_manager.cc |
+++ /dev/null |
@@ -1,170 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/socket/websocket_endpoint_lock_manager.h" |
- |
-#include <utility> |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/message_loop/message_loop.h" |
-#include "net/base/net_errors.h" |
-#include "net/base/net_log.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-// This delay prevents DoS attacks. |
-// TODO(ricea): Replace this with randomised truncated exponential backoff. |
-// See crbug.com/377613. |
-const int kUnlockDelayInMs = 10; |
- |
-} // namespace |
- |
-WebSocketEndpointLockManager::Waiter::~Waiter() { |
- if (next()) { |
- DCHECK(previous()); |
- RemoveFromList(); |
- } |
-} |
- |
-WebSocketEndpointLockManager* WebSocketEndpointLockManager::GetInstance() { |
- return Singleton<WebSocketEndpointLockManager>::get(); |
-} |
- |
-int WebSocketEndpointLockManager::LockEndpoint(const IPEndPoint& endpoint, |
- Waiter* waiter) { |
- LockInfoMap::value_type insert_value(endpoint, LockInfo()); |
- std::pair<LockInfoMap::iterator, bool> rv = |
- lock_info_map_.insert(insert_value); |
- LockInfo& lock_info_in_map = rv.first->second; |
- if (rv.second) { |
- DVLOG(3) << "Locking endpoint " << endpoint.ToString(); |
- lock_info_in_map.queue.reset(new LockInfo::WaiterQueue); |
- return OK; |
- } |
- DVLOG(3) << "Waiting for endpoint " << endpoint.ToString(); |
- lock_info_in_map.queue->Append(waiter); |
- return ERR_IO_PENDING; |
-} |
- |
-void WebSocketEndpointLockManager::RememberSocket(StreamSocket* socket, |
- const IPEndPoint& endpoint) { |
- LockInfoMap::iterator lock_info_it = lock_info_map_.find(endpoint); |
- CHECK(lock_info_it != lock_info_map_.end()); |
- bool inserted = |
- socket_lock_info_map_.insert(SocketLockInfoMap::value_type( |
- socket, lock_info_it)).second; |
- DCHECK(inserted); |
- DCHECK(!lock_info_it->second.socket); |
- lock_info_it->second.socket = socket; |
- DVLOG(3) << "Remembered (StreamSocket*)" << socket << " for " |
- << endpoint.ToString() << " (" << socket_lock_info_map_.size() |
- << " socket(s) remembered)"; |
-} |
- |
-void WebSocketEndpointLockManager::UnlockSocket(StreamSocket* socket) { |
- SocketLockInfoMap::iterator socket_it = socket_lock_info_map_.find(socket); |
- if (socket_it == socket_lock_info_map_.end()) |
- return; |
- |
- LockInfoMap::iterator lock_info_it = socket_it->second; |
- |
- DVLOG(3) << "Unlocking (StreamSocket*)" << socket << " for " |
- << lock_info_it->first.ToString() << " (" |
- << socket_lock_info_map_.size() << " socket(s) left)"; |
- socket_lock_info_map_.erase(socket_it); |
- DCHECK_EQ(socket, lock_info_it->second.socket); |
- lock_info_it->second.socket = NULL; |
- UnlockEndpointAfterDelay(lock_info_it->first); |
-} |
- |
-void WebSocketEndpointLockManager::UnlockEndpoint(const IPEndPoint& endpoint) { |
- LockInfoMap::iterator lock_info_it = lock_info_map_.find(endpoint); |
- if (lock_info_it == lock_info_map_.end()) |
- return; |
- if (lock_info_it->second.socket) |
- EraseSocket(lock_info_it); |
- UnlockEndpointAfterDelay(endpoint); |
-} |
- |
-bool WebSocketEndpointLockManager::IsEmpty() const { |
- return lock_info_map_.empty() && socket_lock_info_map_.empty(); |
-} |
- |
-base::TimeDelta WebSocketEndpointLockManager::SetUnlockDelayForTesting( |
- base::TimeDelta new_delay) { |
- base::TimeDelta old_delay = unlock_delay_; |
- unlock_delay_ = new_delay; |
- return old_delay; |
-} |
- |
-WebSocketEndpointLockManager::LockInfo::LockInfo() : socket(NULL) {} |
-WebSocketEndpointLockManager::LockInfo::~LockInfo() { |
- DCHECK(!socket); |
-} |
- |
-WebSocketEndpointLockManager::LockInfo::LockInfo(const LockInfo& rhs) |
- : socket(rhs.socket) { |
- DCHECK(!rhs.queue); |
-} |
- |
-WebSocketEndpointLockManager::WebSocketEndpointLockManager() |
- : unlock_delay_(base::TimeDelta::FromMilliseconds(kUnlockDelayInMs)), |
- pending_unlock_count_(0), |
- weak_factory_(this) { |
-} |
- |
-WebSocketEndpointLockManager::~WebSocketEndpointLockManager() { |
- DCHECK_EQ(lock_info_map_.size(), pending_unlock_count_); |
- DCHECK(socket_lock_info_map_.empty()); |
-} |
- |
-void WebSocketEndpointLockManager::UnlockEndpointAfterDelay( |
- const IPEndPoint& endpoint) { |
- DVLOG(3) << "Delaying " << unlock_delay_.InMilliseconds() |
- << "ms before unlocking endpoint " << endpoint.ToString(); |
- ++pending_unlock_count_; |
- base::MessageLoop::current()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&WebSocketEndpointLockManager::DelayedUnlockEndpoint, |
- weak_factory_.GetWeakPtr(), endpoint), |
- unlock_delay_); |
-} |
- |
-void WebSocketEndpointLockManager::DelayedUnlockEndpoint( |
- const IPEndPoint& endpoint) { |
- LockInfoMap::iterator lock_info_it = lock_info_map_.find(endpoint); |
- DCHECK_GT(pending_unlock_count_, 0U); |
- --pending_unlock_count_; |
- if (lock_info_it == lock_info_map_.end()) |
- return; |
- DCHECK(!lock_info_it->second.socket); |
- LockInfo::WaiterQueue* queue = lock_info_it->second.queue.get(); |
- DCHECK(queue); |
- if (queue->empty()) { |
- DVLOG(3) << "Unlocking endpoint " << lock_info_it->first.ToString(); |
- lock_info_map_.erase(lock_info_it); |
- return; |
- } |
- |
- DVLOG(3) << "Unlocking endpoint " << lock_info_it->first.ToString() |
- << " and activating next waiter"; |
- Waiter* next_job = queue->head()->value(); |
- next_job->RemoveFromList(); |
- next_job->GotEndpointLock(); |
-} |
- |
-void WebSocketEndpointLockManager::EraseSocket( |
- LockInfoMap::iterator lock_info_it) { |
- DVLOG(3) << "Removing (StreamSocket*)" << lock_info_it->second.socket |
- << " for " << lock_info_it->first.ToString() << " (" |
- << socket_lock_info_map_.size() << " socket(s) left)"; |
- size_t erased = socket_lock_info_map_.erase(lock_info_it->second.socket); |
- DCHECK_EQ(1U, erased); |
- lock_info_it->second.socket = NULL; |
-} |
- |
-} // namespace net |