FARGOS/VISTA Object Management Environment Core  ..
FARGOS/VISTA Object Management Environment Core Table of Contents
OMErefCount.h
Go to the documentation of this file.
1 #ifndef _OME_REFCOUNT_H
2 #define _OME_REFCOUNT_H "$Id: OMErefCount.h 406 2020-07-12 05:07:33Z geoff $"
4 
13 # include <OMEmanifests.h>
14 # include <OMEmutex.h>
15 
16 # ifdef OME_USE_NAMESPACES
17 namespace OME_NAMESPACE
18 {
19 # endif
20 
21 //#define BOGUS_VALUE ((C *) (0xbadbad00))
22 
23 #pragma GCC diagnostic push
24 #pragma GCC diagnostic ignored "-Wsuggest-final-types"
25 
32 {
33 protected:
34  mutable int32_t references;
35  int32_t mutexID;
36 
37  void lockMe();
38 
39  void unlockMe();
40 
41 public:
42  // initializes with references=1
44 
45 #pragma GCC diagnostic push
46 #pragma GCC diagnostic ignored "-Wsuggest-final-methods"
47  virtual ~OMEreferenceCount() {} // = delete;
48 #pragma GCC diagnostic pop
49 
50  void addReadOnlyReference();
51 
52  int_fast32_t dropReference();
53 
54 #pragma GCC diagnostic push
55 #pragma GCC diagnostic ignored "-Wsuggest-final-methods"
56  virtual OMEreferenceCount *deepCopy() const { return (nullptr); }
57 #pragma GCC diagnostic pop
58 
59  OMEreferenceCount *getUniqueReference();
60 
61  int_fast32_t totalReferences() const OME_ALWAYS_INLINE
62  {
63  return (references);
64  }
65 }; // end class OMEreferenceCount
66 
67 #pragma GCC diagnostic pop
68 
79 template <class C> class OME_DLL_EXPORT OMEreferenceToData
80 {
81 protected:
82  C *data;
83 
85  {
86  if (OME_EXPECT_TRUE(data != nullptr)) {
87  data->addReadOnlyReference();
88  }
89  }
90 
91  inline void dropReference(C *newData=nullptr) OME_ALWAYS_INLINE
92  {
93  if (OME_EXPECT_TRUE(data != nullptr)) {
94  data->dropReference();
95  }
96  data = newData;
97  }
98 
99  // default initializer
101  {
102  data = nullptr;
103  }
104 
105  explicit OMEreferenceToData(C *existingData) NONNULL_CLASS_PARAMETERS(2)
106  {
107  existingData->addReadOnlyReference();
108  data = existingData;
109  }
110 
111  // copy initializer
112  inline explicit OMEreferenceToData(const OMEreferenceToData<C> &org)
113  {
114  org.data->addReadOnlyReference();
115  data = org.data;
116  }
117 
119  {
120  dropReference();
121  }
122 
123 public:
127  inline void getUniqueReference()
128  {
129  if (data != nullptr) {
130  C *newData = reinterpret_cast<C *>(data->getUniqueReference());
131  if (newData != data) { // don't write if not needed
132  data = newData;
133  }
134  }
135  }
136 
141  inline int_fast32_t totalReferences() const OME_ALWAYS_INLINE
142  {
143 # ifndef DONT_INCLUDE_VALIDITY_CHECKS
144  if (OME_EXPECT_FALSE(data == nullptr)) {
145  return (-1234);
146  }
147 # endif
148  return (data->totalReferences());
149  }
150 }; // end class OMEreferenceToData<>
151 
152 
153 # ifdef OME_USE_NAMESPACES
154 } // end namespace OME_NAMESPACE
155 # endif
156 
159 #endif
160 /* vim: set expandtab shiftwidth=4 tabstop=4: */
OMErefCount.h
OME reference count implementation.
OME_ATOMIC_INCREMENT
#define OME_ATOMIC_INCREMENT(var)
Definition: OMErefCount.cpp:47
OMEreferenceToData::OMEreferenceToData
OMEreferenceToData(C *existingData) NONNULL_CLASS_PARAMETERS(2)
Definition: OMErefCount.h:105
OMEstartCriticalSection
void OMEstartCriticalSection(eOMEcriticalSectionLabel regionID)
Definition: OMEmutex.cpp:217
OMEreferenceToData::addReadOnlyReference
void addReadOnlyReference() OME_ALWAYS_INLINE
Definition: OMErefCount.h:84
_OME_REFCOUNT_H
#define _OME_REFCOUNT_H
Definition: tmp.o.cpp:974
OMEreferenceToData::data
C * data
Definition: OMErefCount.h:82
OMEreferenceCount::getUniqueReference
OMEreferenceCount * getUniqueReference()
Definition: OMErefCount.cpp:155
OMEreferenceCount::unlockMe
void unlockMe()
Definition: OMErefCount.cpp:132
OMEgetMiscellaneousMutex
uint32_t OMEgetMiscellaneousMutex()
Definition: OMEmutex.cpp:69
NONNULL_CLASS_PARAMETERS
#define NONNULL_CLASS_PARAMETERS(...)
Mark a function as never returning a null pointer.
Definition: compiler_hints.h:337
OME_NAMESPACE
#define OME_NAMESPACE
Definition: OMEmanifests.h:75
OMEreferenceToData
Templated type-specific reference to a reference-counted object.
Definition: OMErefCount.h:79
OMEreferenceCount
Base class for reference-counted data.
Definition: OMErefCount.h:31
OMEreferenceCount::OMEreferenceCount
OMEreferenceCount()
Definition: OMErefCount.cpp:116
OME_ATOMIC_DECREMENT
#define OME_ATOMIC_DECREMENT(result, var)
Definition: OMErefCount.cpp:53
OMEreferenceToData::totalReferences
int_fast32_t totalReferences() const OME_ALWAYS_INLINE
Get current reference total.
Definition: OMErefCount.h:141
OMEreferenceCount::~OMEreferenceCount
virtual ~OMEreferenceCount()
Definition: OMErefCount.h:47
srcID
const char srcID[]
Definition: catSym.c:17
OMEreferenceCount::references
int32_t references
Definition: OMErefCount.h:34
OME_EXPECT_TRUE
#define OME_EXPECT_TRUE(expr)
Annotation macro for conditional expression expected to be true.
Definition: compiler_hints.h:541
__inline
#define __inline
Definition: tmp.o.cpp:3029
OMEreferenceCount::mutexID
int32_t mutexID
Definition: OMErefCount.h:35
OMEreferenceToData::OMEreferenceToData
OMEreferenceToData(const OMEreferenceToData< C > &org)
Definition: OMErefCount.h:112
OME_USED
const char srcID[] OME_USED
Definition: tick_time.cpp:24
OMEreferenceCount::deepCopy
virtual OMEreferenceCount * deepCopy() const
Definition: OMErefCount.h:56
OMEreferenceCount::addReadOnlyReference
void addReadOnlyReference()
Definition: OMErefCount.cpp:139
OMEreferenceCount::totalReferences
int_fast32_t totalReferences() const OME_ALWAYS_INLINE
Definition: OMErefCount.h:61
OMEmanifests.h
OME constants and typedefs.
OMEendCriticalSection
void OMEendCriticalSection(eOMEcriticalSectionLabel regionID)
Definition: OMEmutex.cpp:236
OME_EXPECT_FALSE
#define OME_EXPECT_FALSE(expr)
Annotation macro for conditional expression expected to be false.
Definition: compiler_hints.h:540
OME_ALWAYS_INLINE
#define OME_ALWAYS_INLINE
Tell the compiler to alway inline a function, regardless of optimization level.
Definition: compiler_hints.h:364
OMEreferenceToData::dropReference
void dropReference(C *newData=nullptr) OME_ALWAYS_INLINE
Definition: OMErefCount.h:91
OMEreferenceCount::lockMe
void lockMe()
Definition: OMErefCount.cpp:125
OMEmutex.h
OME mutex and condition variable implementation.
OMEreferenceToData::getUniqueReference
void getUniqueReference()
Force unique reference to the data, which will trigger duplication if necessary (copy-on-write).
Definition: OMErefCount.h:127
OME_DLL_EXPORT
#define OME_DLL_EXPORT
Definition: compiler_hints.h:464
OMEreferenceCount::dropReference
int_fast32_t dropReference()
Definition: OMErefCount.cpp:144
OMEreferenceToData::OMEreferenceToData
OMEreferenceToData()
Definition: OMErefCount.h:100
OMEreferenceToData::~OMEreferenceToData
virtual ~OMEreferenceToData()
Definition: OMErefCount.h:118
Generated: Fri Jul 31 2020 18:19:15
Support Information