43#define SMTG_VALIDATE_DEPENDENCY_COUNT DEVELOPMENT
45#if SMTG_DEPENDENCY_COUNT
47#define SMTG_DEPENDENCY_CHECK_LEVEL 1
52IUpdateHandler* FObject::gUpdateHandler =
nullptr;
65} gFObjectIidInitializer;
70#if SMTG_DEPENDENCY_COUNT && DEVELOPMENT
71 static bool localNeverDebugger =
false;
76 FDebugPrint (
"Refcount is %d when trying to delete %s\n",
refCount,
isA ());
79#if SMTG_DEPENDENCY_COUNT
80#if SMTG_DEPENDENCY_CHECK_LEVEL >= 1
84 SMTG_ASSERT (dependencyCount == 0 || localNeverDebugger);
90#if SMTG_VALIDATE_DEPENDENCY_COUNT
91 if (!gUpdateHandler || gUpdateHandler != UpdateHandler::instance (
false))
94 auto updateHandler = UpdateHandler::instance ();
95 if (!updateHandler || updateHandler ==
this)
98 SMTG_ASSERT ((updateHandler->checkDeferred (
this) ==
false || localNeverDebugger) &&
99 "'this' has scheduled a deferUpdate that was not yet delivered");
101 if (updateHandler->hasDependencies (
this))
104 (
false || localNeverDebugger) &&
105 "Another object is still dependent on 'this'. This leads to zombie entries in the dependency map that can later crash.");
106 FDebugPrint (
"Object still has dependencies %x %s\n",
this, this->
isA ());
107 updateHandler->printForObject (
this);
121 if (FUnknownPrivate::atomicAdd (
refCount, -1) == 0)
133 QUERY_INTERFACE (_iid, obj, FUnknown::iid,
FUnknown)
134 QUERY_INTERFACE (_iid, obj, IDependent::iid,
IDependent)
147#if SMTG_DEPENDENCY_COUNT
155#if SMTG_DEPENDENCY_COUNT && DEVELOPMENT
156 static bool localNeverDebugger =
false;
162#if SMTG_DEPENDENCY_COUNT
163 if (gUpdateHandler != UpdateHandler::instance (
false))
169#if SMTG_DEPENDENCY_CHECK_LEVEL > 1
170 SMTG_ASSERT ((dependencyCount > 0 || localNeverDebugger) &&
171 "All dependencies have already been removed - mmichaelis 7/2021");
174 UpdateHandler::instance ()->removeDependent (
unknownCast (), dep, removeCount);
175 if (removeCount == 0)
177#if SMTG_DEPENDENCY_CHECK_LEVEL > 1
178 SMTG_ASSERT (localNeverDebugger &&
"No dependency to remove - ygrabit 8/2021");
183 SMTG_ASSERT ((removeCount == 1 || localNeverDebugger) &&
184 "Duplicated dependencies established - mmichaelis 7/2021");
186 dependencyCount -= (int16)removeCount;
216bool singletonsTerminated =
false;
221 return singletonsTerminated;
228 singletonsLock->
lock ();
231void unlockRegister ()
233 singletonsLock->
unlock ();
239 if (singletonsTerminated ==
false)
241 if (singletonInstances ==
nullptr)
251 singletonsTerminated =
true;
252 if (singletonInstances)
261 delete singletonInstances;
262 singletonInstances =
nullptr;
264 delete singletonsLock;
265 singletonsLock =
nullptr;
void unlock() SMTG_OVERRIDE
Disables lock.
void lock() SMTG_OVERRIDE
Enables lock.
Implements FUnknown and IDependent.
virtual void addDependent(IDependent *dep)
adds dependency to the object
virtual void removeDependent(IDependent *dep)
removes dependency from the object
virtual void changed(int32 msg=kChanged)
Inform all dependents, that the object has changed.
static const FUID iid
Special UID that is used to cast an FUnknown pointer to a FObject.
uint32 PLUGIN_API addRef() SMTG_OVERRIDE
please refer to FUnknown::addref ()
virtual void deferUpdate(int32 msg=kChanged)
Similar to triggerUpdates, except only delivered in idle (usefull in collecting updates).
virtual ~FObject()
destructor...
tresult PLUGIN_API queryInterface(const TUID _iid, void **obj) SMTG_OVERRIDE
please refer to FUnknown::queryInterface ()
virtual void updateDone(int32)
empty virtual method that should be overridden by derived classes
int32 refCount
COM-model local reference count.
uint32 PLUGIN_API release() SMTG_OVERRIDE
please refer to FUnknown::release ()
virtual FClassID isA() const
a local alternative to getFClassID ()
FUnknown * unknownCast()
get FUnknown interface from object
Handling 16 Byte Globally Unique Identifiers.
The basic interface of all interfaces.
A dependent will get notified about changes of a model.
virtual tresult PLUGIN_API deferUpdates(FUnknown *object, int32 message)=0
Same as triggerUpdates, but delivered in idle (usefull to collect updates).
virtual tresult PLUGIN_API removeDependent(FUnknown *object, IDependent *dependent)=0
Remove a previously installed dependency.
virtual tresult PLUGIN_API triggerUpdates(FUnknown *object, int32 message)=0
Inform all dependents, that object has changed.
virtual tresult PLUGIN_API addDependent(FUnknown *object, IDependent *dependent)=0
Install update notification for given object.
#define SMTG_ASSERT(f)
if DEVELOPMENT is not set, these macros will do nothing.
Basic Object implementing FUnknown.
bool isTerminated()
Returns true when singleton instances were already released.
void lockRegister()
lock and unlock the singleton registration for multi-threading safety
void registerInstance(FObject **o)
registers an instance (type FObject)