Chromium Code Reviews| Index: base/memory/ref_counted_delete_on_message_loop.h |
| diff --git a/base/memory/ref_counted_delete_on_message_loop.h b/base/memory/ref_counted_delete_on_message_loop.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..9a85229fcf220b19bbe3abd9e70ad9add9792635 |
| --- /dev/null |
| +++ b/base/memory/ref_counted_delete_on_message_loop.h |
| @@ -0,0 +1,71 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ |
| +#define BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ |
| + |
| +#include "base/location.h" |
| +#include "base/logging.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/message_loop/message_loop_proxy.h" |
| + |
| +namespace base { |
| + |
| +// RefCountedDeleteOnMessageLoop is similar to RefCountedThreadSafe, and ensures |
|
Mark Mentovai
2013/06/13 18:36:34
Fix the CL description to accurately reflect the n
|
| +// that the object will be deleted on a specified message loop. |
| +// |
| +// Sample usage: |
| +// class Foo : public RefCountedDeleteOnMessageLoop<Foo> { |
| +// |
| +// Foo(const scoped_refptr<MessageLoopProxy>& loop) |
| +// : RefCountedDeleteOnMessageLoop<Foo>(loop) { |
| +// ... |
| +// } |
| +// ... |
| +// private: |
| +// friend class RefCountedDeleteOnMessageLoop<Foo>; |
| +// friend class DeleteHelper<Foo>; |
| +// |
| +// ~Foo(); |
| +// }; |
| + |
| +template <class T> |
| +class RefCountedDeleteOnMessageLoop |
| + : public base::subtle::RefCountedThreadSafeBase { |
|
Mark Mentovai
2013/06/13 18:36:34
You don’t need to say base:: anywhere because you’
|
| + public: |
| + RefCountedDeleteOnMessageLoop( |
| + const scoped_refptr<base::MessageLoopProxy>& proxy) : proxy_(proxy) { |
| + DCHECK(proxy_); |
| + } |
| + |
| + void AddRef() const { |
| + base::subtle::RefCountedThreadSafeBase::AddRef(); |
| + } |
| + |
| + void Release() const { |
| + if (base::subtle::RefCountedThreadSafeBase::Release()) |
| + DestructOnMessageLoop(); |
| + } |
| + |
| + protected: |
| + friend class DeleteHelper<RefCountedDeleteOnMessageLoop>; |
| + ~RefCountedDeleteOnMessageLoop() {} |
| + |
| + void DestructOnMessageLoop() const { |
| + const T* t = static_cast<const T*>(this); |
| + if (proxy_->BelongsToCurrentThread()) |
| + delete t; |
| + else |
| + proxy_->DeleteSoon(FROM_HERE, t); |
| + } |
| + |
| + scoped_refptr<base::MessageLoopProxy> proxy_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(RefCountedDeleteOnMessageLoop); |
| +}; |
| + |
| +} // namespace base |
| + |
| +#endif // BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ |