Add flag to check if currently doing GC
This commit is contained in:
@ -66,6 +66,9 @@ typedef struct RefcountContext {
|
||||
#ifdef REFCOUNT_HAS_THREADS
|
||||
mtx_t so_mtx; //<! Mutex protecting static_objects.
|
||||
mtx_t gr_mtx; //<! Mutex protecting gc_roots.
|
||||
_Atomic bool doing_gc;
|
||||
#else
|
||||
bool doing_gc;
|
||||
#endif
|
||||
} RefcountContext;
|
||||
|
||||
@ -195,6 +198,20 @@ static inline void refcount_context_unref_as_callback(void *obj, void *ctx) {
|
||||
|
||||
ptrdiff_t refcount_context_garbage_collect(RefcountContext *ctx);
|
||||
|
||||
/**
|
||||
* Test weather a give context is currently performing a GC operation.
|
||||
* @param ctx The #RefcountContext
|
||||
* @return True if the context is currently doing a GC operation, false
|
||||
* otherwise
|
||||
*/
|
||||
static bool refcount_context_is_doing_gc(const RefcountContext *ctx) {
|
||||
#ifdef REFCOUNT_HAS_THREADS
|
||||
return atomic_load_explicit(&ctx->doing_gc, memory_order_relaxed);
|
||||
#else
|
||||
return ctx->doing_gc;
|
||||
#endif
|
||||
}
|
||||
|
||||
RefcountWeakref *refcount_context_make_weakref(const RefcountContext *ctx,
|
||||
void *obj);
|
||||
|
||||
@ -320,7 +337,7 @@ static inline void refcount_unref_as_callback(void *obj) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as #refcount_context_garbage_collect, but only operates on the globa
|
||||
* Same as #refcount_context_garbage_collect, but only operates on the global
|
||||
* context.
|
||||
* @return The number of object's freed, or -1 if an error occurred
|
||||
*/
|
||||
@ -328,6 +345,16 @@ static inline ptrdiff_t refcount_garbage_collect(void) {
|
||||
return refcount_context_garbage_collect(refcount_default_context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as #refcount_context_is_doing_gc, but only operates on the global
|
||||
* context.
|
||||
* @return True if the context is currently doing a GC operation, false
|
||||
* otherwise
|
||||
*/
|
||||
static inline bool refcount_is_doing_gc(void) {
|
||||
return refcount_context_is_doing_gc(refcount_default_context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Same as #refcount_context_make_weakref, but operates on the global context.
|
||||
* @param obj The object to reference
|
||||
|
Reference in New Issue
Block a user