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. 4 5 #ifndef BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ 6 #define BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ 7 8 #include "base/location.h" 9 #include "base/logging.h" 10 #include "base/memory/ref_counted.h" 11 #include "base/message_loop/message_loop_proxy.h" 12 13 namespace base { 14 15 // RefCountedDeleteOnMessageLoop is similar to RefCountedThreadSafe, and ensures 16 // that the object will be deleted on a specified message loop. 17 // 18 // Sample usage: 19 // class Foo : public RefCountedDeleteOnMessageLoop<Foo> { 20 // 21 // Foo(const scoped_refptr<MessageLoopProxy>& loop) 22 // : RefCountedDeleteOnMessageLoop<Foo>(loop) { 23 // ... 24 // } 25 // ... 26 // private: 27 // friend class RefCountedDeleteOnMessageLoop<Foo>; 28 // friend class DeleteHelper<Foo>; 29 // 30 // ~Foo(); 31 // }; 32 33 template <class T> 34 class RefCountedDeleteOnMessageLoop : public subtle::RefCountedThreadSafeBase { 35 public: 36 RefCountedDeleteOnMessageLoop( 37 const scoped_refptr<MessageLoopProxy>& proxy) : proxy_(proxy) { 38 DCHECK(proxy_.get()); 39 } 40 41 void AddRef() const { 42 subtle::RefCountedThreadSafeBase::AddRef(); 43 } 44 45 void Release() const { 46 if (subtle::RefCountedThreadSafeBase::Release()) 47 DestructOnMessageLoop(); 48 } 49 50 protected: 51 friend class DeleteHelper<RefCountedDeleteOnMessageLoop>; 52 ~RefCountedDeleteOnMessageLoop() {} 53 54 void DestructOnMessageLoop() const { 55 const T* t = static_cast<const T*>(this); 56 if (proxy_->BelongsToCurrentThread()) 57 delete t; 58 else 59 proxy_->DeleteSoon(FROM_HERE, t); 60 } 61 62 scoped_refptr<MessageLoopProxy> proxy_; 63 64 private: 65 DISALLOW_COPY_AND_ASSIGN(RefCountedDeleteOnMessageLoop); 66 }; 67 68 } // namespace base 69 70 #endif // BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_ 71