#define _GNU_SOURCE /* GHC's semi-public Rts API */ #include #include #include int check_object_type(void *instance, GType type) { int result; if (instance != NULL) { result = !!G_TYPE_CHECK_INSTANCE_TYPE(instance, type); } else { result = 0; fprintf(stderr, "Check failed: got a null pointer\n"); } return result; } static int print_debug_info () { static int __print_debug_info = -1; if (__print_debug_info == -1) { __print_debug_info = secure_getenv ("HASKELL_GI_DEBUG_MEM") != NULL; } return __print_debug_info; } /* Auxiliary function for freeing boxed types */ void boxed_free_helper (GType *gtype, void *boxed) { if (print_debug_info()) { fprintf(stderr, "Freeing a boxed object at %p\n", boxed); fprintf(stderr, "\tIt is of type %s\n", g_type_name(*gtype)); } g_boxed_free (*gtype, boxed); g_free (gtype); if (print_debug_info()) { fprintf(stderr, "\tdone\n"); } } void dbg_g_object_unref (GObject *obj) { GType gtype; if (print_debug_info()) { fprintf(stderr, "Freeing a GObject at %p\n", obj); gtype = G_TYPE_FROM_INSTANCE (obj); fprintf(stderr, "\tIt is of type %s\n", g_type_name(gtype)); fprintf(stderr, "\tIts refcount before unref is %d\n", (int)obj->ref_count); } g_object_unref(obj); if (print_debug_info()) { fprintf(stderr, "\tdone\n"); } } gpointer dbg_g_object_newv (GType gtype, guint n_params, GParameter *params) { gpointer result; if (print_debug_info()) { fprintf(stderr, "Creating a new GObject of type %s\n", g_type_name(gtype)); } result = g_object_newv (gtype, n_params, params); if (print_debug_info()) { fprintf(stderr, "\tdone, got a pointer at %p\n", result); } return result; } /* Same as freeHaskellFunctionPtr, but it does nothing when given a null pointer, instead of crashing */ void safeFreeFunPtr(void *ptr) { if (ptr != NULL) freeHaskellFunctionPtr(ptr); }