diff options
Diffstat (limited to 'ghook.c')
-rw-r--r-- | ghook.c | 30 |
1 files changed, 21 insertions, 9 deletions
@@ -286,7 +286,7 @@ g_hook_list_invoke (GHookList *hook_list, if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; - tmp = g_hook_next_valid (hook, may_recurse); + tmp = g_hook_next_valid (hook_list, hook, may_recurse); g_hook_unref (hook_list, hook); hook = tmp; @@ -321,7 +321,7 @@ g_hook_list_invoke_check (GHookList *hook_list, if (need_destroy) g_hook_destroy_link (hook_list, hook); - tmp = g_hook_next_valid (hook, may_recurse); + tmp = g_hook_next_valid (hook_list, hook, may_recurse); g_hook_unref (hook_list, hook); hook = tmp; @@ -357,7 +357,7 @@ g_hook_list_marshal_check (GHookList *hook_list, if (need_destroy) g_hook_destroy_link (hook_list, hook); - tmp = g_hook_next_valid (hook, may_recurse); + tmp = g_hook_next_valid (hook_list, hook, may_recurse); g_hook_unref (hook_list, hook); hook = tmp; @@ -390,7 +390,7 @@ g_hook_list_marshal (GHookList *hook_list, if (!was_in_call) hook->flags &= ~G_HOOK_FLAG_IN_CALL; - tmp = g_hook_next_valid (hook, may_recurse); + tmp = g_hook_next_valid (hook_list, hook, may_recurse); g_hook_unref (hook_list, hook); hook = tmp; @@ -408,12 +408,13 @@ g_hook_first_valid (GHookList *hook_list, GHook *hook; hook = hook_list->hooks; + g_hook_ref (hook_list, hook); if (hook) { if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) return hook; else - return g_hook_next_valid (hook, may_be_in_call); + return g_hook_next_valid (hook_list, hook, may_be_in_call); } } @@ -421,9 +422,14 @@ g_hook_first_valid (GHookList *hook_list, } GHook* -g_hook_next_valid (GHook *hook, - gboolean may_be_in_call) +g_hook_next_valid (GHookList *hook_list, + GHook *hook, + gboolean may_be_in_call) { + GHook *ohook = hook; + + g_return_val_if_fail (hook_list != NULL, NULL); + if (!hook) return NULL; @@ -431,10 +437,16 @@ g_hook_next_valid (GHook *hook, while (hook) { if (G_HOOK_IS_VALID (hook) && (may_be_in_call || !G_HOOK_IN_CALL (hook))) - return hook; + { + g_hook_ref (hook_list, hook); + g_hook_unref (hook_list, ohook); + + return hook; + } hook = hook->next; } - + g_hook_unref (hook_list, ohook); + return NULL; } |