void _cogl_atlas_remove_reorganize_callback (CoglAtlas *atlas, GHookFunc pre_callback, GHookFunc post_callback, void *user_data) { if (pre_callback) { GHook *hook = g_hook_find_func_data (&atlas->pre_reorganize_callbacks, FALSE, pre_callback, user_data); if (hook) g_hook_destroy_link (&atlas->pre_reorganize_callbacks, hook); } if (post_callback) { GHook *hook = g_hook_find_func_data (&atlas->post_reorganize_callbacks, FALSE, post_callback, user_data); if (hook) g_hook_destroy_link (&atlas->post_reorganize_callbacks, hook); } }
/** * g_hook_list_marshal_check: * @hook_list: a #GHookList * @may_recurse: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped * @marshaller: the function to call for each #GHook * @marshal_data: data to pass to @marshaller * * Calls a function on each valid #GHook and destroys it if the * function returns %FALSE. */ void g_hook_list_marshal_check (GHookList *hook_list, gboolean may_recurse, GHookCheckMarshaller marshaller, gpointer data) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (marshaller != NULL); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { gboolean was_in_call; gboolean need_destroy; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; need_destroy = !marshaller (hook, data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; if (need_destroy) g_hook_destroy_link (hook_list, hook); hook = g_hook_next_valid (hook_list, hook, may_recurse); } }
/** * g_hook_list_invoke_check: * @hook_list: a #GHookList * @may_recurse: %TRUE if functions which are already running * (e.g. in another thread) can be called. If set to %FALSE, * these are skipped * * Calls all of the #GHook functions in a #GHookList. * Any function which returns %FALSE is removed from the #GHookList. */ void g_hook_list_invoke_check (GHookList *hook_list, gboolean may_recurse) { GHook *hook; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); hook = g_hook_first_valid (hook_list, may_recurse); while (hook) { GHookCheckFunc func; gboolean was_in_call; gboolean need_destroy; func = (GHookCheckFunc) hook->func; was_in_call = G_HOOK_IN_CALL (hook); hook->flags |= G_HOOK_FLAG_IN_CALL; need_destroy = !func (hook->data); if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; if (need_destroy) g_hook_destroy_link (hook_list, hook); hook = g_hook_next_valid (hook_list, hook, may_recurse); } }
/** * g_hook_list_clear: * @hook_list: a #GHookList * * Removes all the #GHook elements from a #GHookList. */ void g_hook_list_clear (GHookList *hook_list) { g_return_if_fail (hook_list != NULL); if (hook_list->is_setup) { GHook *hook; hook_list->is_setup = FALSE; hook = hook_list->hooks; if (!hook) { /* destroy hook_list->hook_memchunk */ } else do { GHook *tmp; g_hook_ref (hook_list, hook); g_hook_destroy_link (hook_list, hook); tmp = hook->next; g_hook_unref (hook_list, hook); hook = tmp; } while (hook); } }
void g_hook_list_clear (GHookList *hook_list) { g_return_if_fail (hook_list != NULL); if (hook_list->is_setup) { GHook *hook; hook_list->is_setup = FALSE; hook = hook_list->hooks; if (!hook) { g_mem_chunk_destroy (hook_list->hook_memchunk); hook_list->hook_memchunk = NULL; } else do { GHook *tmp; g_hook_ref (hook_list, hook); g_hook_destroy_link (hook_list, hook); tmp = hook->next; g_hook_unref (hook_list, hook); hook = tmp; } while (hook); if (hook_list->hook_memchunk) g_warning (G_STRLOC ": failed to clear hooklist, unconsolidated references on hooks left"); } }
void _cogl_pango_glyph_cache_remove_reorganize_callback (CoglPangoGlyphCache *cache, GHookFunc func, void *user_data) { GHook *hook = g_hook_find_func_data (&cache->reorganize_callbacks, FALSE, func, user_data); if (hook) g_hook_destroy_link (&cache->reorganize_callbacks, hook); }
gboolean g_source_remove_by_user_data (gpointer user_data) { GHook *hook; G_LOCK (main_loop); hook = g_hook_find_data (&source_list, TRUE, user_data); if (hook) g_hook_destroy_link (&source_list, hook); G_UNLOCK (main_loop); return hook != NULL; }
void gth_hook_remove_callback (const char *name, GCallback callback) { GthHook *hook; GHook *function; hook = GET_HOOK (name); function = g_hook_find_func (hook->list, TRUE, callback); if (function == NULL) { g_warning ("callback not found in hook '%s'", name); return; } g_hook_destroy_link (hook->list, function); }
gboolean g_source_remove (guint tag) { GHook *hook; g_return_val_if_fail (tag > 0, FALSE); G_LOCK (main_loop); hook = g_hook_get (&source_list, tag); if (hook) g_hook_destroy_link (&source_list, hook); G_UNLOCK (main_loop); return hook != NULL; }
/** * g_hook_destroy: * @hook_list: a #GHookList * @hook_id: a hook ID * * Destroys a #GHook, given its ID. * * Returns: %TRUE if the #GHook was found in the #GHookList and destroyed */ gboolean g_hook_destroy (GHookList *hook_list, gulong hook_id) { GHook *hook; g_return_val_if_fail (hook_list != NULL, FALSE); g_return_val_if_fail (hook_id > 0, FALSE); hook = g_hook_get (hook_list, hook_id); if (hook) { g_hook_destroy_link (hook_list, hook); return TRUE; } return FALSE; }
/* HOLDS: main_loop_lock */ static void g_main_dispatch (GTimeVal *dispatch_time) { while (pending_dispatches != NULL) { gboolean need_destroy; GSource *source = pending_dispatches->data; GSList *tmp_list; tmp_list = pending_dispatches; pending_dispatches = g_slist_remove_link (pending_dispatches, pending_dispatches); g_slist_free_1 (tmp_list); if (G_HOOK_IS_VALID (source)) { gboolean was_in_call; gpointer hook_data = source->hook.data; gpointer source_data = source->source_data; gboolean (*dispatch) (gpointer, GTimeVal *, gpointer); dispatch = ((GSourceFuncs *) source->hook.func)->dispatch; was_in_call = G_HOOK_IN_CALL (source); source->hook.flags |= G_HOOK_FLAG_IN_CALL; G_UNLOCK (main_loop); need_destroy = ! dispatch (source_data, dispatch_time, hook_data); G_LOCK (main_loop); if (!was_in_call) source->hook.flags &= ~G_HOOK_FLAG_IN_CALL; if (need_destroy && G_HOOK_IS_VALID (source)) g_hook_destroy_link (&source_list, (GHook *) source); } g_hook_unref (&source_list, (GHook*) source); } }
gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, gpointer user_data) { gpointer d[2]; GHook *hook; g_return_val_if_fail (funcs != NULL, FALSE); G_LOCK (main_loop); d[0] = funcs; d[1] = user_data; hook = g_hook_find (&source_list, TRUE, g_source_find_funcs_user_data, d); if (hook) g_hook_destroy_link (&source_list, hook); G_UNLOCK (main_loop); return hook != NULL; }
void gnc_gconf_general_remove_cb (const gchar *key, GncGconfGeneralCb func, gpointer user_data) { GHookList *hook_list; GHook *hook; g_once(&gcb_init_once, gcb_init, NULL); hook_list = g_hash_table_lookup(gcb_callback_hash, key); if (hook_list == NULL) return; hook = g_hook_find_func_data(hook_list, TRUE, func, user_data); if (hook == NULL) return; g_hook_destroy_link(hook_list, hook); if (hook_list->hooks == NULL) { g_hash_table_remove(gcb_callback_hash, key); g_free(hook_list); } }
void gnc_hook_remove_dangler (const gchar *name, GFunc callback) { GncHook *gnc_hook; GHook *hook; ENTER("name %s, function %p", name, callback); gnc_hook = gnc_hook_lookup(name); if (gnc_hook == NULL) { LEAVE("Unknown hook list %s", name); return; } hook = g_hook_find(gnc_hook->c_danglers, TRUE, hook_remove_runner, callback); if (hook == NULL) { LEAVE("Hook %p not found in %s", callback, name); return; } g_hook_destroy_link(gnc_hook->c_danglers, hook); LEAVE("Removed %p from %s", hook, name); }