// Copyright 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 // that the object will be deleted on a specified message loop. // // Sample usage: // class Foo : public RefCountedDeleteOnMessageLoop { // // Foo(const scoped_refptr& loop) // : RefCountedDeleteOnMessageLoop(loop) { // ... // } // ... // private: // friend class RefCountedDeleteOnMessageLoop; // friend class DeleteHelper; // // ~Foo(); // }; template class RefCountedDeleteOnMessageLoop : public subtle::RefCountedThreadSafeBase { public: RefCountedDeleteOnMessageLoop( const scoped_refptr& proxy) : proxy_(proxy) { DCHECK(proxy_.get()); } void AddRef() const { subtle::RefCountedThreadSafeBase::AddRef(); } void Release() const { if (subtle::RefCountedThreadSafeBase::Release()) DestructOnMessageLoop(); } protected: friend class DeleteHelper; ~RefCountedDeleteOnMessageLoop() {} void DestructOnMessageLoop() const { const T* t = static_cast(this); if (proxy_->BelongsToCurrentThread()) delete t; else proxy_->DeleteSoon(FROM_HERE, t); } scoped_refptr proxy_; private: DISALLOW_COPY_AND_ASSIGN(RefCountedDeleteOnMessageLoop); }; } // namespace base #endif // BASE_MEMORY_REF_COUNTED_DELETE_ON_MESSAGE_LOOP_H_