[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