Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2046)

Unified Diff: media/blink/multibuffer.cc

Issue 1399603003: Tie multibuffers to URLs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@media_cache
Patch Set: formatted Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/blink/multibuffer.h ('k') | media/blink/multibuffer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/blink/multibuffer.cc
diff --git a/media/blink/multibuffer.cc b/media/blink/multibuffer.cc
index 41c35825f53d179b8dab721f71a4dd7baa03b25a..a8d981eba88b812ec3694af4fe8698082c49dcf9 100644
--- a/media/blink/multibuffer.cc
+++ b/media/blink/multibuffer.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <utility>
+
#include "media/blink/multibuffer.h"
#include "base/bind.h"
@@ -113,10 +115,6 @@ MultiBuffer::MultiBuffer(int32_t block_size_shift,
: max_size_(0), block_size_shift_(block_size_shift), lru_(global_lru) {}
MultiBuffer::~MultiBuffer() {
- // Delete all writers.
- for (const auto& i : writer_index_) {
- delete i.second;
- }
// Remove all blocks from the LRU.
for (const auto& i : data_) {
lru_->Remove(this, i.first);
@@ -155,15 +153,14 @@ void MultiBuffer::AddReader(const BlockId& pos, Reader* reader) {
// Make sure that there are no present blocks between the writer and
// the requested position, as that will cause the writer to quit.
if (closest_writer > closest_block) {
- provider = writer_index_[closest_writer];
+ provider = writer_index_[closest_writer].get();
DCHECK(provider);
}
}
if (!provider) {
DCHECK(writer_index_.find(pos) == writer_index_.end());
- provider = writer_index_[pos] = CreateWriter(pos);
- provider->SetAvailableCallback(base::Bind(
- &MultiBuffer::DataProviderEvent, base::Unretained(this), provider));
+ writer_index_[pos] = CreateWriter(pos);
+ provider = writer_index_[pos].get();
}
provider->SetDeferred(false);
}
@@ -183,7 +180,7 @@ void MultiBuffer::CleanupWriters(const BlockId& pos) {
BlockId closest_writer = ClosestPreviousEntry(writer_index_, p2);
while (closest_writer > pos - kMaxWaitForWriterOffset) {
DCHECK(writer_index_[closest_writer]);
- DataProviderEvent(writer_index_[closest_writer]);
+ OnDataProviderEvent(writer_index_[closest_writer].get());
closest_writer = ClosestPreviousEntry(writer_index_, closest_writer - 1);
}
}
@@ -258,25 +255,28 @@ void MultiBuffer::ReleaseBlocks(const std::vector<MultiBufferBlockId>& blocks) {
}
}
}
+ if (data_.empty())
+ OnEmpty();
}
+void MultiBuffer::OnEmpty() {}
+
void MultiBuffer::AddProvider(scoped_ptr<DataProvider> provider) {
// If there is already a provider in the same location, we delete it.
DCHECK(!provider->Available());
BlockId pos = provider->Tell();
- DataProvider** place = &writer_index_[pos];
- DCHECK_NE(*place, provider.get());
- if (*place)
- delete *place;
- *place = provider.release();
+ writer_index_[pos] = std::move(provider);
}
scoped_ptr<MultiBuffer::DataProvider> MultiBuffer::RemoveProvider(
DataProvider* provider) {
BlockId pos = provider->Tell();
- DCHECK_EQ(writer_index_[pos], provider);
- writer_index_.erase(pos);
- return scoped_ptr<DataProvider>(provider);
+ auto iter = writer_index_.find(pos);
+ DCHECK(iter != writer_index_.end());
+ DCHECK_EQ(iter->second.get(), provider);
+ scoped_ptr<DataProvider> ret = std::move(iter->second);
+ writer_index_.erase(iter);
+ return ret;
}
MultiBuffer::ProviderState MultiBuffer::SuggestProviderState(
@@ -324,7 +324,7 @@ void MultiBuffer::Prune(size_t max_to_free) {
lru_->Prune(max_to_free);
}
-void MultiBuffer::DataProviderEvent(DataProvider* provider_tmp) {
+void MultiBuffer::OnDataProviderEvent(DataProvider* provider_tmp) {
scoped_ptr<DataProvider> provider(RemoveProvider(provider_tmp));
BlockId start_pos = provider->Tell();
BlockId pos = start_pos;
@@ -333,7 +333,7 @@ void MultiBuffer::DataProviderEvent(DataProvider* provider_tmp) {
while (!ProviderCollision(pos) && !eof) {
if (!provider->Available()) {
- AddProvider(provider.Pass());
+ AddProvider(std::move(provider));
break;
}
DCHECK_GE(pos, 0);
@@ -361,7 +361,7 @@ void MultiBuffer::DataProviderEvent(DataProvider* provider_tmp) {
// Even if we did call AddProvider, calling NotifyAvailableRange can cause
// readers to seek or self-destruct and clean up any associated writers.
auto i = writer_index_.find(pos);
- if (i != writer_index_.end() && i->second == provider_tmp) {
+ if (i != writer_index_.end() && i->second.get() == provider_tmp) {
switch (SuggestProviderState(pos)) {
case ProviderStateLoad:
// Not sure we actually need to do this
« no previous file with comments | « media/blink/multibuffer.h ('k') | media/blink/multibuffer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698