Loading...
Searching...
No Matches
refBase.h
Go to the documentation of this file.
1//
2// Copyright 2016 Pixar
3//
4// Licensed under the Apache License, Version 2.0 (the "Apache License")
5// with the following modification; you may not use this file except in
6// compliance with the Apache License and the following modification to it:
7// Section 6. Trademarks. is deleted and replaced with:
8//
9// 6. Trademarks. This License does not grant permission to use the trade
10// names, trademarks, service marks, or product names of the Licensor
11// and its affiliates, except as required to comply with Section 4(c) of
12// the License and to reproduce the content of the NOTICE file.
13//
14// You may obtain a copy of the Apache License at
15//
16// http://www.apache.org/licenses/LICENSE-2.0
17//
18// Unless required by applicable law or agreed to in writing, software
19// distributed under the Apache License with the above modification is
20// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21// KIND, either express or implied. See the Apache License for the specific
22// language governing permissions and limitations under the Apache License.
23//
24#ifndef PXR_BASE_TF_REF_BASE_H
25#define PXR_BASE_TF_REF_BASE_H
26
29
30#include "pxr/pxr.h"
31
32#include "pxr/base/tf/api.h"
33
34#include <atomic>
35#include <cmath>
36
37PXR_NAMESPACE_OPEN_SCOPE
38
39template <class T> class TfRefPtr;
40template <class T> class TfWeakPtr;
41
73class TfRefBase {
74public:
75
76 typedef void (*UniqueChangedFuncPtr)(TfRefBase const *, bool);
77 struct UniqueChangedListener {
78 void (*lock)();
79 UniqueChangedFuncPtr func;
80 void (*unlock)();
81 };
82
83 // This mimics the old TfRefCount's default ctor behavior, which set
84 // _refCount to 1.
85 TfRefBase() : _refCount(1) {}
86
87 // This mimics the old TfRefCount's copy ctor behavior, which set _refCount
88 // to 1 on copy construction.
89 TfRefBase(TfRefBase const &) : _refCount(1) {}
90
91 // This mimics the old TfRefCount's copy assignment behavior, which took no
92 // action.
93 TfRefBase &operator=(TfRefBase const &) {
94 return *this;
95 }
96
98 size_t GetCurrentCount() const {
99 // Return the absolute value since the sign encodes whether or not this
100 // TfRefBase invokes the UniqueChangedListener.
101 return std::abs(_refCount.load(std::memory_order_relaxed));
102 }
103
105 bool IsUnique() const {
106 return GetCurrentCount() == 1;
107 }
108
109 void SetShouldInvokeUniqueChangedListener(bool shouldCall) {
110 int curValue = _refCount.load(std::memory_order_relaxed);
111 while ((curValue > 0 && shouldCall) ||
112 (curValue < 0 && !shouldCall)) {
113 if (_refCount.compare_exchange_weak(curValue, -curValue)) {
114 return;
115 }
116 }
117 }
118
119 TF_API static void SetUniqueChangedListener(UniqueChangedListener listener);
120
121protected:
122 /*
123 * Prohibit deletion through a TfRefBase pointer.
124 */
125 TF_API virtual ~TfRefBase();
126
127private:
128 // For TfRefPtr's use.
129 std::atomic_int &_GetRefCount() const {
130 return _refCount;
131 }
132
133 // Note! Counts can be both positive or negative. Negative counts indicate
134 // that we must invoke the _uniqueChangedListener if the count goes 1 -> 2
135 // or 2 -> 1 (which is really -1 -> -2 or -2 -> -1).
136 mutable std::atomic_int _refCount;
137
138 static UniqueChangedListener _uniqueChangedListener;
139 template <typename T> friend class TfRefPtr;
140 friend struct Tf_RefPtr_UniqueChangedCounter;
141 friend struct Tf_RefPtr_Counter;
142
143 template <typename T> friend TfRefPtr<T>
145};
146
157public:
158 TF_API virtual ~TfSimpleRefBase();
159};
160
161PXR_NAMESPACE_CLOSE_SCOPE
162
163#endif // PXR_BASE_TF_REF_BASE_H
Enable a concrete base class for use with TfRefPtr.
Definition: refBase.h:73
friend TfRefPtr< T > TfCreateRefPtrFromProtectedWeakPtr(TfWeakPtr< T > const &)
Thread-safe creation of a Tf ref pointer from a Tf weak pointer.
Definition: weakPtr.h:277
bool IsUnique() const
Return true if only one TfRefPtr points to this object.
Definition: refBase.h:105
size_t GetCurrentCount() const
Return the current reference count of this object.
Definition: refBase.h:98
Reference-counted smart pointer utility class.
Definition: refPtr.h:601
Enable a concrete base class for use with TfRefPtr that inhibits the "unique changed" facility of TfR...
Definition: refBase.h:156
Pointer storage with deletion detection.
Definition: weakPtr.h:145