summaryrefslogtreecommitdiff
path: root/ghook.c
diff options
context:
space:
mode:
Diffstat (limited to 'ghook.c')
-rw-r--r--ghook.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/ghook.c b/ghook.c
index b683b7c31..8705e63b9 100644
--- a/ghook.c
+++ b/ghook.c
@@ -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;
}