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

Unified Diff: cc/surfaces/surface_manager.cc

Issue 553213003: Avoid destroying surface before the parent surface stops referencing it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months 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
Index: cc/surfaces/surface_manager.cc
diff --git a/cc/surfaces/surface_manager.cc b/cc/surfaces/surface_manager.cc
index 1e3699d30a5c82afe399c92c5288247ff56f943c..920f464cdd03595b76c260b287d41a560fa6b9a4 100644
--- a/cc/surfaces/surface_manager.cc
+++ b/cc/surfaces/surface_manager.cc
@@ -6,6 +6,7 @@
#include "base/logging.h"
#include "cc/surfaces/surface.h"
+#include "cc/surfaces/surface_id_allocator.h"
namespace cc {
@@ -15,6 +16,12 @@ SurfaceManager::SurfaceManager() {
SurfaceManager::~SurfaceManager() {
DCHECK(thread_checker_.CalledOnValidThread());
+ for (SurfaceDestroyList::iterator it = surfaces_to_destroy_.begin();
+ it != surfaces_to_destroy_.end();
+ ++it) {
+ DeregisterSurface(it->first->surface_id());
+ delete it->first;
+ }
}
void SurfaceManager::RegisterSurface(Surface* surface) {
@@ -31,6 +38,51 @@ void SurfaceManager::DeregisterSurface(SurfaceId surface_id) {
surface_map_.erase(it);
}
+void SurfaceManager::DestroyOnSequence(
+ scoped_ptr<Surface> surface,
+ const std::set<SurfaceSequence>& dependency_set) {
+ surfaces_to_destroy_.push_back(make_pair(surface.release(), dependency_set));
+ SearchForSatisfaction();
+}
+
+void SurfaceManager::DidSatisfySequences(SurfaceId id,
+ std::vector<uint32_t>* sequence) {
+ for (std::vector<uint32_t>::iterator it = sequence->begin();
+ it != sequence->end();
+ ++it) {
+ satisfied_sequences_.insert(
+ SurfaceSequence(SurfaceIdAllocator::NamespaceForId(id), *it));
+ }
+ sequence->clear();
+ SearchForSatisfaction();
+}
+
+void SurfaceManager::SearchForSatisfaction() {
+ for (SurfaceDestroyList::iterator dest_it = surfaces_to_destroy_.begin();
+ dest_it != surfaces_to_destroy_.end();) {
+ std::set<SurfaceSequence>& dependency_set = dest_it->second;
+
+ for (std::set<SurfaceSequence>::iterator it = dependency_set.begin();
+ it != dependency_set.end();) {
+ if (satisfied_sequences_.count(*it) > 0) {
+ satisfied_sequences_.erase(*it);
+ std::set<SurfaceSequence>::iterator old_it = it;
+ ++it;
+ dependency_set.erase(old_it);
+ } else {
+ ++it;
+ }
+ }
+ if (dependency_set.empty()) {
+ scoped_ptr<Surface> surf(dest_it->first);
+ DeregisterSurface(surf->surface_id());
+ dest_it = surfaces_to_destroy_.erase(dest_it);
+ } else {
+ ++dest_it;
+ }
+ }
+}
+
Surface* SurfaceManager::GetSurfaceForId(SurfaceId surface_id) {
DCHECK(thread_checker_.CalledOnValidThread());
SurfaceMap::iterator it = surface_map_.find(surface_id);

Powered by Google App Engine
This is Rietveld 408576698