mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-12 01:25:49 +00:00
Add a ThreadSafeRefCountedBase
A version of RefCountedBase that uses std::atomic_int to store its reference count. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202984 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include "llvm/Support/Casting.h"
|
#include "llvm/Support/Casting.h"
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
@@ -88,6 +89,31 @@ namespace llvm {
|
|||||||
static void retain(T *obj) { obj->Retain(); }
|
static void retain(T *obj) { obj->Retain(); }
|
||||||
static void release(T *obj) { obj->Release(); }
|
static void release(T *obj) { obj->Release(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// \brief A thread-safe version of \c llvm::RefCountedBase.
|
||||||
|
///
|
||||||
|
/// A generic base class for objects that wish to have their lifetimes managed
|
||||||
|
/// using reference counts. Classes subclass \c ThreadSafeRefCountedBase to
|
||||||
|
/// obtain such functionality, and are typically handled with
|
||||||
|
/// \c IntrusiveRefCntPtr "smart pointers" which automatically handle the
|
||||||
|
/// management of reference counts.
|
||||||
|
template <class Derived>
|
||||||
|
class ThreadSafeRefCountedBase {
|
||||||
|
mutable std::atomic_int RefCount;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ThreadSafeRefCountedBase() : RefCount(0) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Retain() const { ++RefCount; }
|
||||||
|
|
||||||
|
void Release() const {
|
||||||
|
int NewRefCount = --RefCount;
|
||||||
|
assert(NewRefCount >= 0 && "Reference count was already zero.");
|
||||||
|
if (NewRefCount == 0)
|
||||||
|
delete static_cast<const Derived*>(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
/// IntrusiveRefCntPtr - A template class that implements a "smart pointer"
|
/// IntrusiveRefCntPtr - A template class that implements a "smart pointer"
|
||||||
|
Reference in New Issue
Block a user