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