hook_size * G_HOOKS_PREALLOC,
G_ALLOC_AND_FREE);
hook_list->hook_free = NULL;
+ hook_list->hook_destroy = NULL;
}
void
{
hook->hook_id = 0;
hook->flags &= ~G_HOOK_FLAG_ACTIVE;
- if (hook->destroy)
+ if (hook_list->hook_destroy)
+ {
+ hook_list->hook_destroy (hook_list, hook);
+ hook->destroy = NULL;
+ }
+ else if (hook->destroy)
{
GDestroyNotify destroy;
hook = g_hook_first_valid (hook_list, may_recurse);
while (hook)
{
- GHook *tmp;
GHookFunc func;
gboolean was_in_call;
- g_hook_ref (hook_list, hook);
func = (GHookFunc) hook->func;
was_in_call = G_HOOK_IN_CALL (hook);
if (!was_in_call)
hook->flags &= ~G_HOOK_FLAG_IN_CALL;
- tmp = g_hook_next_valid (hook_list, hook, may_recurse);
-
- g_hook_unref (hook_list, hook);
- hook = tmp;
+ hook = g_hook_next_valid (hook_list, hook, may_recurse);
}
}
hook = g_hook_first_valid (hook_list, may_recurse);
while (hook)
{
- GHook *tmp;
GHookCheckFunc func;
gboolean was_in_call;
gboolean need_destroy;
- g_hook_ref (hook_list, hook);
func = (GHookCheckFunc) hook->func;
was_in_call = G_HOOK_IN_CALL (hook);
if (need_destroy)
g_hook_destroy_link (hook_list, hook);
- tmp = g_hook_next_valid (hook_list, hook, may_recurse);
-
- g_hook_unref (hook_list, hook);
- hook = tmp;
+ hook = g_hook_next_valid (hook_list, hook, may_recurse);
}
}
hook = g_hook_first_valid (hook_list, may_recurse);
while (hook)
{
- GHook *tmp;
gboolean was_in_call;
gboolean need_destroy;
- g_hook_ref (hook_list, hook);
-
was_in_call = G_HOOK_IN_CALL (hook);
hook->flags |= G_HOOK_FLAG_IN_CALL;
need_destroy = !marshaller (hook, data);
if (need_destroy)
g_hook_destroy_link (hook_list, hook);
- tmp = g_hook_next_valid (hook_list, hook, may_recurse);
-
- g_hook_unref (hook_list, hook);
- hook = tmp;
+ hook = g_hook_next_valid (hook_list, hook, may_recurse);
}
}
hook = g_hook_first_valid (hook_list, may_recurse);
while (hook)
{
- GHook *tmp;
gboolean was_in_call;
- g_hook_ref (hook_list, hook);
-
was_in_call = G_HOOK_IN_CALL (hook);
hook->flags |= G_HOOK_FLAG_IN_CALL;
marshaller (hook, data);
if (!was_in_call)
hook->flags &= ~G_HOOK_FLAG_IN_CALL;
- tmp = g_hook_next_valid (hook_list, hook, may_recurse);
-
- g_hook_unref (hook_list, hook);
- hook = tmp;
+ hook = g_hook_next_valid (hook_list, hook, may_recurse);
}
}