Chromium Code Reviews| 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..31581407a511cf7cdde87383046847761f40e54c 100644 |
| --- a/cc/output/context_cache_controller.h |
| +++ b/cc/output/context_cache_controller.h |
| @@ -8,6 +8,7 @@ |
| #include <cstdint> |
| #include <memory> |
| +#include "base/cancelable_callback.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "cc/base/cc_export.h" |
| @@ -15,6 +16,7 @@ |
| 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,34 @@ 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); |
| + |
| gpu::ContextSupport* context_support_; |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
| GrContext* gr_context_ = nullptr; |
| uint32_t num_clients_visible_ = 0; |
| + uint32_t num_clients_busy_ = 0; |
| + |
| + // If set, |context_lock_| is used to ensure we safely access our data when |
| + // in an idle callback. |
| + base::Lock* context_lock_ = nullptr; |
| + base::CancelableCallback<void(uint32_t idle_generation)> idle_callback_; |
|
danakj
2016/09/22 00:01:25
I think you just want a WeakPtrFactory in this cla
ericrk
2016/09/22 00:28:59
Yeah - that is nicer - updated.
|
| + |
| + // Used to invalidate idle callbacks. We can't just cancel |idle_callback_|, |
| + // as we must be able to invalidate from multiple threads, and idle_callback_ |
| + // is not threadsafe. |
| + uint32_t current_idle_generation_ = 0; |
| }; |
| } // namespace cc |