void g_hook_free (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (!G_HOOK_IN_CALL (hook)); hook_list->finalize_hook (hook_list, hook); g_chunk_free (hook, hook_list->hook_memchunk); }
/** * g_hook_free: * @hook_list: a #GHookList * @hook: the #GHook to free * * Calls the #GHookList @finalize_hook function if it exists, * and frees the memory allocated for the #GHook. */ void g_hook_free (GHookList *hook_list, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (!G_HOOK_IN_CALL (hook)); if(hook_list->finalize_hook != NULL) hook_list->finalize_hook (hook_list, hook); g_slice_free1 (hook_list->hook_size, hook); }
/** * g_hook_insert_before: * @hook_list: a #GHookList * @sibling: the #GHook to insert the new #GHook before * @hook: the #GHook to insert * * Inserts a #GHook into a #GHookList, before a given #GHook. */ void g_hook_insert_before (GHookList *hook_list, GHook *sibling, GHook *hook) { g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (hook->ref_count == 0); hook->hook_id = hook_list->seq_id++; hook->ref_count = 1; /* counterpart to g_hook_destroy_link */ if (sibling) { if (sibling->prev) { hook->prev = sibling->prev; hook->prev->next = hook; hook->next = sibling; sibling->prev = hook; } else { hook_list->hooks = hook; hook->next = sibling; sibling->prev = hook; } } else { if (hook_list->hooks) { sibling = hook_list->hooks; while (sibling->next) sibling = sibling->next; hook->prev = sibling; sibling->next = hook; } else hook_list->hooks = hook; } }
/** * g_hook_insert_sorted: * @hook_list: a #GHookList * @hook: the #GHook to insert * @func: the comparison function used to sort the #GHook elements * * Inserts a #GHook into a #GHookList, sorted by the given function. */ void g_hook_insert_sorted (GHookList *hook_list, GHook *hook, GHookCompareFunc func) { GHook *sibling; g_return_if_fail (hook_list != NULL); g_return_if_fail (hook_list->is_setup); g_return_if_fail (hook != NULL); g_return_if_fail (G_HOOK_IS_UNLINKED (hook)); g_return_if_fail (hook->func != NULL); g_return_if_fail (func != NULL); /* first non-destroyed hook */ sibling = hook_list->hooks; while (sibling && !sibling->hook_id) sibling = sibling->next; while (sibling) { GHook *tmp; g_hook_ref (hook_list, sibling); if (func (hook, sibling) <= 0 && sibling->hook_id) { g_hook_unref (hook_list, sibling); break; } /* next non-destroyed hook */ tmp = sibling->next; while (tmp && !tmp->hook_id) tmp = tmp->next; g_hook_unref (hook_list, sibling); sibling = tmp; } g_hook_insert_before (hook_list, sibling, hook); }