added g_hook_list_marshal_check() to eventually destroy hooks after they
authorTim Janik <timj@gtk.org>
Mon, 30 Nov 1998 07:08:54 +0000 (07:08 +0000)
committerTim Janik <timj@src.gnome.org>
Mon, 30 Nov 1998 07:08:54 +0000 (07:08 +0000)
Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>

        * glib.h:
        * ghook.c: added g_hook_list_marshal_check() to eventually destroy
        hooks after they got marshalled.

12 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
ghook.c
glib.h
glib/ghook.c
glib/glib.h

index b4279e6..e80c15f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
index b4279e6..e80c15f 100644 (file)
@@ -1,3 +1,9 @@
+Mon Nov 30 07:12:10 1998  Tim Janik  <timj@gtk.org>
+
+       * glib.h:
+       * ghook.c: added g_hook_list_marshal_check() to eventually destroy
+       hooks after they got marshalled.
+
 Sun Nov 29 17:31:43 EST 1998  Jeff Garzik  <jgarzik@pobox.com>
 
        * configure.in, Makefile.am, gmodule/Makefile.am:
diff --git a/ghook.c b/ghook.c
index 2e231ea..47a2874 100644 (file)
--- a/ghook.c
+++ b/ghook.c
@@ -324,6 +324,42 @@ g_hook_list_invoke_check (GHookList *hook_list,
 }
 
 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)
+    {
+      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 (!was_in_call)
+       hook->flags &= ~G_HOOK_FLAG_IN_CALL;
+      if (need_destroy)
+       g_hook_destroy_link (hook_list, hook);
+      
+      tmp = g_hook_next_valid (hook, may_recurse);
+      
+      g_hook_unref (hook_list, hook);
+      hook = tmp;
+    }
+}
+
+void
 g_hook_list_marshal (GHookList              *hook_list,
                     gboolean                 may_recurse,
                     GHookMarshaller          marshaller,
diff --git a/glib.h b/glib.h
index 39c73f8..353051e 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -765,6 +765,8 @@ typedef gboolean    (*GHookFindFunc)        (GHook          *hook,
                                                 gpointer        data);
 typedef void           (*GHookMarshaller)      (GHook          *hook,
                                                 gpointer        data);
+typedef gboolean       (*GHookCheckMarshaller) (GHook          *hook,
+                                                gpointer        data);
 typedef void           (*GHookFunc)            (gpointer        data);
 typedef gboolean       (*GHookCheckFunc)       (gpointer        data);
 typedef void           (*GHookFreeFunc)        (GHookList      *hook_list,
@@ -1215,6 +1217,10 @@ void      g_hook_list_marshal            (GHookList              *hook_list,
                                         gboolean                may_recurse,
                                         GHookMarshaller         marshaller,
                                         gpointer                data);
+void    g_hook_list_marshal_check      (GHookList              *hook_list,
+                                        gboolean                may_recurse,
+                                        GHookCheckMarshaller    marshaller,
+                                        gpointer                data);
 
 
 /* Fatal error handlers.
index 2e231ea..47a2874 100644 (file)
@@ -324,6 +324,42 @@ g_hook_list_invoke_check (GHookList *hook_list,
 }
 
 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)
+    {
+      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 (!was_in_call)
+       hook->flags &= ~G_HOOK_FLAG_IN_CALL;
+      if (need_destroy)
+       g_hook_destroy_link (hook_list, hook);
+      
+      tmp = g_hook_next_valid (hook, may_recurse);
+      
+      g_hook_unref (hook_list, hook);
+      hook = tmp;
+    }
+}
+
+void
 g_hook_list_marshal (GHookList              *hook_list,
                     gboolean                 may_recurse,
                     GHookMarshaller          marshaller,
index 39c73f8..353051e 100644 (file)
@@ -765,6 +765,8 @@ typedef gboolean    (*GHookFindFunc)        (GHook          *hook,
                                                 gpointer        data);
 typedef void           (*GHookMarshaller)      (GHook          *hook,
                                                 gpointer        data);
+typedef gboolean       (*GHookCheckMarshaller) (GHook          *hook,
+                                                gpointer        data);
 typedef void           (*GHookFunc)            (gpointer        data);
 typedef gboolean       (*GHookCheckFunc)       (gpointer        data);
 typedef void           (*GHookFreeFunc)        (GHookList      *hook_list,
@@ -1215,6 +1217,10 @@ void      g_hook_list_marshal            (GHookList              *hook_list,
                                         gboolean                may_recurse,
                                         GHookMarshaller         marshaller,
                                         gpointer                data);
+void    g_hook_list_marshal_check      (GHookList              *hook_list,
+                                        gboolean                may_recurse,
+                                        GHookCheckMarshaller    marshaller,
+                                        gpointer                data);
 
 
 /* Fatal error handlers.