ref_counted_delete_on_message_loop.h revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
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
13namespace 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
33template <class T>
34class 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