Index: openmp/libomptarget/include/Utilities.h =================================================================== --- openmp/libomptarget/include/Utilities.h +++ openmp/libomptarget/include/Utilities.h @@ -19,6 +19,7 @@ #include "Debug.h" #include +#include #include #include #include @@ -129,6 +130,34 @@ using StringEnvar = Envar; using BoolEnvar = Envar; +/// 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. Do not assume any memory order guarantees with other +/// memory operations; the atomic updates of this class operate with relaxed +/// memory order. +template 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 increaseRefCount() { Refs.fetch_add(1, std::memory_order_relaxed); } + + /// 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 decreaseRefCount() { + Ty Prev = Refs.fetch_sub(1, std::memory_order_relaxed); + assert(Prev > 0 && "Invalid refcount"); + return (Prev == 1); + } + +private: + /// The atomic reference counter. + std::atomic Refs; +}; + template <> inline bool StringParser::parse(const char *ValueStr, bool &Result) { std::string Value(ValueStr);