const struct GC_finalizer_closure *fc
= (struct GC_finalizer_closure *)(fc_word
& ~(word)FINALIZER_CLOSURE_FLAG);
+ GC_ASSERT(!GC_find_leak);
(*fc->proc)((word *)obj + 1, fc->cd);
}
return 0;
{
GC_ASSERT((unsigned)kind < MAXOBJKINDS);
GC_ASSERT(NONNULL_ARG_NOT_NULL(proc));
- GC_obj_kinds[kind].ok_disclaim_proc = proc;
- GC_obj_kinds[kind].ok_mark_unconditionally = (GC_bool)mark_unconditionally;
+ if (!EXPECT(GC_find_leak, FALSE)) {
+ GC_obj_kinds[kind].ok_disclaim_proc = proc;
+ GC_obj_kinds[kind].ok_mark_unconditionally =
+ (GC_bool)mark_unconditionally;
+ }
}
GC_API GC_ATTR_MALLOC void * GC_CALL GC_finalized_malloc(size_t lb,
/* (including the referred closure object) will be protected from */
/* collection if "mark_from_all" is non-zero, but at the expense that */
/* long chains of objects will take many cycles to reclaim. */
+/* Calls to GC_free() will free its argument without inquiring "proc". */
+/* No-op in the leak-finding mode. */
GC_API void GC_CALL GC_register_disclaim_proc(int /*kind*/,
GC_disclaim_proc /*proc*/,
int /*mark_from_all*/) GC_ATTR_NONNULL(2);
/* Note that GC_size (applied to such allocated object) returns a value */
/* slightly bigger than the specified allocation size, and that GC_base */
/* result points to a word prior to the start of the allocated object. */
+/* The disclaim procedure is not invoked in the leak-finding mode. */
GC_API GC_ATTR_MALLOC GC_ATTR_ALLOC_SIZE(1) void * GC_CALL
GC_finalized_malloc(size_t /*size*/,
const struct GC_finalizer_closure * /*fc*/) GC_ATTR_NONNULL(2);