Sync: Avoid deadlock in SyncBackendRegistrar / ModelSafeWorker on sync backend shutdown.
[chromium-blink-merge.git] / cc / resources / texture_mailbox_deleter.h
blobca0bc0032ca4ca6ed479c3f6dab266caf77e34b9
1 // Copyright 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.
5 #ifndef CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_
6 #define CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_
8 #include "base/memory/weak_ptr.h"
9 #include "cc/base/cc_export.h"
10 #include "cc/base/scoped_ptr_vector.h"
12 namespace base {
13 class SingleThreadTaskRunner;
16 namespace cc {
17 class ContextProvider;
18 class SingleReleaseCallback;
20 class CC_EXPORT TextureMailboxDeleter {
21 public:
22 explicit TextureMailboxDeleter(
23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner);
24 ~TextureMailboxDeleter();
26 // Returns a Callback that can be used as the ReleaseCallback for a
27 // TextureMailbox attached to the |texture_id|. The ReleaseCallback can
28 // be passed to other threads and will destroy the texture, once it is
29 // run, on the impl thread. If the TextureMailboxDeleter is destroyed
30 // due to the compositor shutting down, then the ReleaseCallback will
31 // become a no-op and the texture will be deleted immediately on the
32 // impl thread, along with dropping the reference to the ContextProvider.
33 scoped_ptr<SingleReleaseCallback> GetReleaseCallback(
34 const scoped_refptr<ContextProvider>& context_provider,
35 unsigned texture_id);
37 private:
38 // Runs the |impl_callback| to delete the texture and removes the callback
39 // from the |impl_callbacks_| list.
40 void RunDeleteTextureOnImplThread(SingleReleaseCallback* impl_callback,
41 uint32 sync_point,
42 bool is_lost);
44 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_;
45 ScopedPtrVector<SingleReleaseCallback> impl_callbacks_;
46 base::WeakPtrFactory<TextureMailboxDeleter> weak_ptr_factory_;
49 } // namespace cc
51 #endif // CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_