Index: net/websockets/websocket_throttle.cc |
diff --git a/net/websockets/websocket_throttle.cc b/net/websockets/websocket_throttle.cc |
deleted file mode 100644 |
index 59e73fda3c9ecc844ee19db7e3a4b250304a718a..0000000000000000000000000000000000000000 |
--- a/net/websockets/websocket_throttle.cc |
+++ /dev/null |
@@ -1,144 +0,0 @@ |
-// Copyright (c) 2012 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/websockets/websocket_throttle.h" |
- |
-#include <algorithm> |
-#include <set> |
-#include <string> |
-#include <utility> |
- |
-#include "base/memory/singleton.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/strings/string_number_conversions.h" |
-#include "base/strings/string_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "net/base/io_buffer.h" |
-#include "net/socket_stream/socket_stream.h" |
-#include "net/websockets/websocket_job.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-const size_t kMaxWebSocketJobsThrottled = 1024; |
- |
-} // namespace |
- |
-WebSocketThrottle::WebSocketThrottle() { |
-} |
- |
-WebSocketThrottle::~WebSocketThrottle() { |
- DCHECK(queue_.empty()); |
- DCHECK(addr_map_.empty()); |
-} |
- |
-// static |
-WebSocketThrottle* WebSocketThrottle::GetInstance() { |
- return Singleton<WebSocketThrottle>::get(); |
-} |
- |
-bool WebSocketThrottle::PutInQueue(WebSocketJob* job) { |
- if (queue_.size() >= kMaxWebSocketJobsThrottled) |
- return false; |
- |
- queue_.push_back(job); |
- const AddressList& address_list = job->address_list(); |
- std::set<IPEndPoint> address_set; |
- for (AddressList::const_iterator addr_iter = address_list.begin(); |
- addr_iter != address_list.end(); |
- ++addr_iter) { |
- const IPEndPoint& address = *addr_iter; |
- // If |address| is already processed, don't do it again. |
- if (!address_set.insert(address).second) |
- continue; |
- |
- ConnectingAddressMap::iterator iter = addr_map_.find(address); |
- if (iter == addr_map_.end()) { |
- ConnectingAddressMap::iterator new_queue = |
- addr_map_.insert(make_pair(address, ConnectingQueue())).first; |
- new_queue->second.push_back(job); |
- } else { |
- DCHECK(!iter->second.empty()); |
- iter->second.push_back(job); |
- job->SetWaiting(); |
- DVLOG(1) << "Waiting on " << address.ToString(); |
- } |
- } |
- |
- return true; |
-} |
- |
-void WebSocketThrottle::RemoveFromQueue(WebSocketJob* job) { |
- ConnectingQueue::iterator queue_iter = |
- std::find(queue_.begin(), queue_.end(), job); |
- if (queue_iter == queue_.end()) |
- return; |
- queue_.erase(queue_iter); |
- |
- std::set<WebSocketJob*> wakeup_candidates; |
- |
- const AddressList& resolved_address_list = job->address_list(); |
- std::set<IPEndPoint> address_set; |
- for (AddressList::const_iterator addr_iter = resolved_address_list.begin(); |
- addr_iter != resolved_address_list.end(); |
- ++addr_iter) { |
- const IPEndPoint& address = *addr_iter; |
- // If |address| is already processed, don't do it again. |
- if (!address_set.insert(address).second) |
- continue; |
- |
- ConnectingAddressMap::iterator map_iter = addr_map_.find(address); |
- DCHECK(map_iter != addr_map_.end()); |
- |
- ConnectingQueue& per_address_queue = map_iter->second; |
- DCHECK(!per_address_queue.empty()); |
- // Job may not be front of the queue if the socket is closed while waiting. |
- ConnectingQueue::iterator per_address_queue_iter = |
- std::find(per_address_queue.begin(), per_address_queue.end(), job); |
- bool was_front = false; |
- if (per_address_queue_iter != per_address_queue.end()) { |
- was_front = (per_address_queue_iter == per_address_queue.begin()); |
- per_address_queue.erase(per_address_queue_iter); |
- } |
- if (per_address_queue.empty()) { |
- addr_map_.erase(map_iter); |
- } else if (was_front) { |
- // The new front is a wake-up candidate. |
- wakeup_candidates.insert(per_address_queue.front()); |
- } |
- } |
- |
- WakeupSocketIfNecessary(wakeup_candidates); |
-} |
- |
-void WebSocketThrottle::WakeupSocketIfNecessary( |
- const std::set<WebSocketJob*>& wakeup_candidates) { |
- for (std::set<WebSocketJob*>::const_iterator iter = wakeup_candidates.begin(); |
- iter != wakeup_candidates.end(); |
- ++iter) { |
- WebSocketJob* job = *iter; |
- if (!job->IsWaiting()) |
- continue; |
- |
- bool should_wakeup = true; |
- const AddressList& resolved_address_list = job->address_list(); |
- for (AddressList::const_iterator addr_iter = resolved_address_list.begin(); |
- addr_iter != resolved_address_list.end(); |
- ++addr_iter) { |
- const IPEndPoint& address = *addr_iter; |
- ConnectingAddressMap::iterator map_iter = addr_map_.find(address); |
- DCHECK(map_iter != addr_map_.end()); |
- const ConnectingQueue& per_address_queue = map_iter->second; |
- if (job != per_address_queue.front()) { |
- should_wakeup = false; |
- break; |
- } |
- } |
- if (should_wakeup) |
- job->Wakeup(); |
- } |
-} |
- |
-} // namespace net |