Loading...
Searching...
No Matches
Classes | Namespaces | Macros
prefinalizer.h File Reference
#include "cppgc/internal/compiler-specific.h"
#include "cppgc/liveness-broker.h"
Include dependency graph for prefinalizer.h:

Go to the source code of this file.

Classes

class  cppgc::internal::PrefinalizerRegistration
 

Namespaces

namespace  cppgc
 
namespace  cppgc::internal
 

Macros

#define CPPGC_USING_PRE_FINALIZER(Class, PreFinalizer)
 

Macro Definition Documentation

◆ CPPGC_USING_PRE_FINALIZER

#define CPPGC_USING_PRE_FINALIZER (   Class,
  PreFinalizer 
)
Value:
public: \
static bool InvokePreFinalizer(const cppgc::LivenessBroker& liveness_broker, \
void* object) { \
static_assert(cppgc::IsGarbageCollectedOrMixinTypeV<Class>, \
"Only garbage collected objects can have prefinalizers"); \
Class* self = static_cast<Class*>(object); \
if (liveness_broker.IsHeapObjectAlive(self)) return false; \
self->PreFinalizer(); \
return true; \
} \
\
private: \
CPPGC_NO_UNIQUE_ADDRESS cppgc::internal::PrefinalizerRegistration \
prefinalizer_dummy_{this, Class::InvokePreFinalizer}; \
static_assert(true, "Force semicolon.")
Definition: liveness-broker.h:44
bool IsHeapObjectAlive(const T *object) const
Definition: liveness-broker.h:47
#define CPPGC_NO_UNIQUE_ADDRESS
Definition: compiler-specific.h:27

Macro must be used in the private section of Class and registers a prefinalization callback void Class::PreFinalizer(). The callback is invoked on garbage collection after the collector has found an object to be dead.

Callback properties:

  • The callback is invoked before a possible destructor for the corresponding object.
  • The callback may access the whole object graph, irrespective of whether objects are considered dead or alive.
  • The callback is invoked on the same thread as the object was created on.

Example:

class WithPrefinalizer : public GarbageCollected<WithPrefinalizer> {
CPPGC_USING_PRE_FINALIZER(WithPrefinalizer, Dispose);
public:
void Trace(Visitor*) const {}
void Dispose() { prefinalizer_called = true; }
~WithPrefinalizer() {
// prefinalizer_called == true
}
private:
bool prefinalizer_called = false;
};
#define CPPGC_USING_PRE_FINALIZER(Class, PreFinalizer)
Definition: prefinalizer.h:56