stream_registry.cc revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/streams/stream_registry.h"
6
7#include "content/browser/streams/stream.h"
8
9namespace content {
10
11namespace {
12// The maximum size of memory each StreamRegistry instance is allowed to use
13// for its Stream instances.
14const size_t kDefaultMaxMemoryUsage = 1024 * 1024 * 1024U;  // 1GiB
15}
16
17StreamRegistry::StreamRegistry()
18    : total_memory_usage_(0),
19      max_memory_usage_(kDefaultMaxMemoryUsage) {
20}
21
22StreamRegistry::~StreamRegistry() {
23}
24
25void StreamRegistry::RegisterStream(scoped_refptr<Stream> stream) {
26  DCHECK(CalledOnValidThread());
27  DCHECK(stream.get());
28  DCHECK(!stream->url().is_empty());
29  streams_[stream->url()] = stream;
30}
31
32scoped_refptr<Stream> StreamRegistry::GetStream(const GURL& url) {
33  DCHECK(CalledOnValidThread());
34  StreamMap::const_iterator stream = streams_.find(url);
35  if (stream != streams_.end())
36    return stream->second;
37
38  return NULL;
39}
40
41bool StreamRegistry::CloneStream(const GURL& url, const GURL& src_url) {
42  DCHECK(CalledOnValidThread());
43  scoped_refptr<Stream> stream(GetStream(src_url));
44  if (stream.get()) {
45    streams_[url] = stream;
46    return true;
47  }
48  return false;
49}
50
51void StreamRegistry::UnregisterStream(const GURL& url) {
52  DCHECK(CalledOnValidThread());
53
54  StreamMap::iterator iter = streams_.find(url);
55  if (iter == streams_.end())
56    return;
57
58  size_t buffered_bytes = iter->second->last_total_buffered_bytes();
59  DCHECK_LE(buffered_bytes, total_memory_usage_);
60  total_memory_usage_ -= buffered_bytes;
61  streams_.erase(url);
62}
63
64bool StreamRegistry::UpdateMemoryUsage(const GURL& url,
65                                       size_t current_size,
66                                       size_t increase) {
67  DCHECK(CalledOnValidThread());
68
69  StreamMap::iterator iter = streams_.find(url);
70  // A Stream must be registered with its parent registry to get memory.
71  if (iter == streams_.end())
72    return false;
73
74  size_t last_size = iter->second->last_total_buffered_bytes();
75  DCHECK_LE(last_size, total_memory_usage_);
76  size_t usage_of_others = total_memory_usage_ - last_size;
77  DCHECK_LE(current_size, last_size);
78  size_t current_total_memory_usage = usage_of_others + current_size;
79
80  if (increase > max_memory_usage_ - current_total_memory_usage)
81    return false;
82
83  total_memory_usage_ = current_total_memory_usage + increase;
84  return true;
85}
86
87}  // namespace content
88