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

Unified Diff: cc/output/context_cache_controller.h

Issue 2353033003: Idle cleanup for worker context (Closed)
Patch Set: comments + feedback Created 4 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
« no previous file with comments | « cc/BUILD.gn ('k') | cc/output/context_cache_controller.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/context_cache_controller.h
diff --git a/cc/output/context_cache_controller.h b/cc/output/context_cache_controller.h
index 03f7e2cd74f9117e11cb95ac6db4a747199301f7..357e5daacb5862f0863492625804ec1e8c7353bc 100644
--- a/cc/output/context_cache_controller.h
+++ b/cc/output/context_cache_controller.h
@@ -10,11 +10,13 @@
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
#include "cc/base/cc_export.h"
class GrContext;
namespace base {
+class Lock;
class SingleThreadTaskRunner;
}
@@ -25,26 +27,26 @@ class ContextSupport;
namespace cc {
// ContextCacheController manages clearing cached data on ContextProvider when
-// appropriate. Currently, cache clearing happens when the ContextProvider
-// transitions from visible to not visible. As a ContextProvider may have
-// multiple clients, ContextCacheController tracks visibility across all
-// clients and only cleans up when appropriate.
-//
-// Note: Virtuals on this function are for testing only. This function is not
-// designed to have multiple implementations.
+// appropriate. Currently, cache clearing is triggered when the Context
+// provider transitions from Visible to Not Visible, or from Busy to Idle. As a
+// ContextProvider may have multiple clients, ContextCacheController tracks
+// visibility and idle status across all clients and only cleans up when
+// appropriate.
class CC_EXPORT ContextCacheController {
public:
- class CC_EXPORT ScopedVisibility {
+ class CC_EXPORT ScopedToken {
public:
- ~ScopedVisibility();
+ ~ScopedToken();
private:
friend class ContextCacheController;
- ScopedVisibility();
+ ScopedToken();
void Release();
bool released_ = false;
};
+ using ScopedVisibility = ScopedToken;
+ using ScopedBusy = ScopedToken;
ContextCacheController(
gpu::ContextSupport* context_support,
@@ -52,6 +54,7 @@ class CC_EXPORT ContextCacheController {
virtual ~ContextCacheController();
void SetGrContext(GrContext* gr_context);
+ void SetLock(base::Lock* lock);
// Clients of the owning ContextProvider should call this function when they
// become visible. The returned ScopedVisibility pointer must be passed back
@@ -64,17 +67,42 @@ class CC_EXPORT ContextCacheController {
virtual void ClientBecameNotVisible(
std::unique_ptr<ScopedVisibility> scoped_visibility);
- protected:
- std::unique_ptr<ScopedVisibility> CreateScopedVisibilityForTesting() const;
- void ReleaseScopedVisibilityForTesting(
- std::unique_ptr<ScopedVisibility> scoped_visibility) const;
+ // Clients of the owning ContextProvider may call this function when they
+ // become busy. The returned ScopedBusy pointer must be passed back
+ // to ClientBecameNotBusy or it will DCHECK in its destructor.
+ std::unique_ptr<ScopedBusy> ClientBecameBusy();
+
+ // When a client becomes not busy, it must pass back any ScopedBusy
+ // pointers it owns via this function.
+ void ClientBecameNotBusy(std::unique_ptr<ScopedBusy> scoped_busy);
private:
+ void OnIdle(uint32_t idle_generation);
+ void PostIdleCallback(uint32_t current_idle_generation) const;
+ void InvalidatePendingIdleCallbacks();
+
gpu::ContextSupport* context_support_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
GrContext* gr_context_ = nullptr;
+ // If set, |context_lock_| must be held before accessing any member within
+ // the idle callback. Exceptions to this are |current_idle_generation_|,
+ // which has its own lock, and weak_ptr_ and task_runner_, which may be
+ // accessed from multiple threads without locking.
+ base::Lock* context_lock_ = nullptr;
+
uint32_t num_clients_visible_ = 0;
+ uint32_t num_clients_busy_ = 0;
+ bool callback_pending_ = false;
+
+ // |current_idle_generation_lock_| must be held when accessing
+ // |current_idle_generation_|. |current_idle_generation_lock_| must never be
+ // held while acquiring |context_lock_|.
+ base::Lock current_idle_generation_lock_;
+ uint32_t current_idle_generation_ = 0;
+
+ base::WeakPtr<ContextCacheController> weak_ptr_;
+ base::WeakPtrFactory<ContextCacheController> weak_factory_;
};
} // namespace cc
« no previous file with comments | « cc/BUILD.gn ('k') | cc/output/context_cache_controller.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698