[Openmp-commits] [PATCH] D139787: [OpenMP][libomptarget] Add utility class for reference counting
Kevin Sala Penadés via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Sun Dec 11 12:41:45 PST 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbbcffb08f0fd: [OpenMP][libomptarget] Add utility class for reference counting (authored by kevinsala).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139787/new/
https://reviews.llvm.org/D139787
Files:
openmp/libomptarget/include/Utilities.h
Index: openmp/libomptarget/include/Utilities.h
===================================================================
--- openmp/libomptarget/include/Utilities.h
+++ 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 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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D139787.481943.patch
Type: text/x-patch
Size: 1594 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/openmp-commits/attachments/20221211/a0a1755d/attachment.bin>
More information about the Openmp-commits
mailing list