diff options
Diffstat (limited to 'net/spdy/write_blocked_list.h')
-rw-r--r-- | net/spdy/write_blocked_list.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/net/spdy/write_blocked_list.h b/net/spdy/write_blocked_list.h new file mode 100644 index 0000000..fe5668f --- /dev/null +++ b/net/spdy/write_blocked_list.h @@ -0,0 +1,86 @@ +// Copyright 2013 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. + +#ifndef NET_SPDY_WRITE_BLOCKED_LIST_H_ +#define NET_SPDY_WRITE_BLOCKED_LIST_H_ + +#include <algorithm> +#include <deque> + +#include "base/logging.h" + +namespace net { + +const int kHighestPriority = 0; +const int kLowestPriority = 7; + +template <typename IdType> +class WriteBlockedList { + public: + // 0(1) size lookup. 0(1) insert at front or back. + typedef std::deque<IdType> BlockedList; + typedef typename BlockedList::iterator iterator; + + // Returns the priority of the highest priority list with sessions on it, or + // -1 if none of the lists have pending sessions. + int GetHighestPriorityWriteBlockedList() const { + for (int i = 0; i <= kLowestPriority; ++i) { + if (write_blocked_lists_[i].size() > 0) + return i; + } + return -1; + } + + int PopFront(int priority) { + DCHECK(!write_blocked_lists_[priority].empty()); + IdType stream_id = write_blocked_lists_[priority].front(); + write_blocked_lists_[priority].pop_front(); + return stream_id; + } + + bool HasWriteBlockedStreamsGreaterThanPriority(int priority) const { + for (int i = kHighestPriority; i < priority; ++i) { + if (!write_blocked_lists_[i].empty()) { + return true; + } + } + return false; + } + + bool HasWriteBlockedStreams() const { + return HasWriteBlockedStreamsGreaterThanPriority(kLowestPriority + 1); + } + + void PushBack(IdType stream_id, int priority) { + write_blocked_lists_[priority].push_back(stream_id); + } + + void RemoveStreamFromWriteBlockedList(IdType stream_id, int priority) { + iterator it = std::find(write_blocked_lists_[priority].begin(), + write_blocked_lists_[priority].end(), + stream_id); + while (it != write_blocked_lists_[priority].end()) { + write_blocked_lists_[priority].erase(it); + it = std::find(write_blocked_lists_[priority].begin(), + write_blocked_lists_[priority].end(), + stream_id); + } + } + + int NumBlockedStreams() { + int num_blocked_streams = 0; + for (int i = kHighestPriority; i <= kLowestPriority; ++i) { + num_blocked_streams += write_blocked_lists_[i].size(); + } + return num_blocked_streams; + } + + private: + // Priority ranges from 0 to 7 + BlockedList write_blocked_lists_[8]; +}; + +} // namespace net + +#endif // NET_SPDY_WRITE_BLOCKED_LIST_H_ |