[Openmp-commits] [openmp] bbcffb0 - [OpenMP][libomptarget] Add utility class for reference counting
Kevin Sala via Openmp-commits
openmp-commits at lists.llvm.org
Sun Dec 11 12:41:35 PST 2022
Author: Kevin Sala
Date: 2022-12-11T21:39:25+01:00
New Revision: bbcffb08f0fdc0be8c8cba48410f9cb556ea661d
URL: https://github.com/llvm/llvm-project/commit/bbcffb08f0fdc0be8c8cba48410f9cb556ea661d
DIFF: https://github.com/llvm/llvm-project/commit/bbcffb08f0fdc0be8c8cba48410f9cb556ea661d.diff
LOG: [OpenMP][libomptarget] Add utility class for reference counting
The AMDGPU NextGen plugin will use this class for counting the references of some device resources.
Differential Revision: https://reviews.llvm.org/D139787
Added:
Modified:
openmp/libomptarget/include/Utilities.h
Removed:
################################################################################
diff --git a/openmp/libomptarget/include/Utilities.h b/openmp/libomptarget/include/Utilities.h
index 6428c07b1e7e..813ffd08aefb 100644
--- a/openmp/libomptarget/include/Utilities.h
+++ b/openmp/libomptarget/include/Utilities.h
@@ -19,6 +19,7 @@
#include "Debug.h"
#include <algorithm>
+#include <atomic>
#include <cassert>
#include <cstdint>
#include <cstdlib>
@@ -129,6 +130,36 @@ using UInt64Envar = Envar<uint64_t>;
using StringEnvar = Envar<std::string>;
using BoolEnvar = Envar<bool>;
+/// Utility class for thread-safe reference counting. Any class that needs
+/// objects' reference counting can inherit from this entity or have it as a
+/// class data member.
+template <typename Ty = uint32_t,
+ std::memory_order MemoryOrder = std::memory_order_relaxed>
+struct RefCountTy {
+ /// Create a refcount object initialized to zero.
+ RefCountTy() : Refs(0) {}
+
+ ~RefCountTy() { assert(Refs == 0 && "Destroying with non-zero refcount"); }
+
+ /// Increase the reference count atomically.
+ void increase() { Refs.fetch_add(1, MemoryOrder); }
+
+ /// Decrease the reference count and return whether it became zero. Decreasing
+ /// the counter in more units than it was previously increased results in
+ /// undefined behavior.
+ bool decrease() {
+ Ty Prev = Refs.fetch_sub(1, MemoryOrder);
+ assert(Prev > 0 && "Invalid refcount");
+ return (Prev == 1);
+ }
+
+ Ty get() const { return Refs.load(MemoryOrder); }
+
+private:
+ /// The atomic reference counter.
+ std::atomic<Ty> Refs;
+};
+
template <>
inline bool StringParser::parse(const char *ValueStr, bool &Result) {
std::string Value(ValueStr);
More information about the Openmp-commits
mailing list