Remove pollfds from the context here, not when actually freeing the
authorOwen Taylor <otaylor@redhat.com>
Sun, 10 Dec 2000 16:02:48 +0000 (16:02 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 10 Dec 2000 16:02:48 +0000 (16:02 +0000)
Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>

* gmain.c (g_source_destroy_internal): Remove pollfds
from the context here, not when actually freeing the
source.

* gmain.c (g_source_unref_internal): Free source list
and source, call source->source_funcs->destroy().

* giochannel.c: Unreference io_channel properly.

14 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
giochannel.c
glib/giochannel.c
glib/gmain.c
glib/gmain.h
gmain.c
gmain.h

index 28adbe9..5b83137 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 28adbe9..5b83137 100644 (file)
@@ -1,3 +1,22 @@
+Sun Dec 10 10:47:11 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_destroy_internal): Remove pollfds
+       from the context here, not when actually freeing the
+       source.
+
+       * gmain.c (g_source_unref_internal): Free source list
+       and source, call source->source_funcs->destroy().
+
+       * giochannel.c: Unreference io_channel properly.
+
+Thu Dec  7 15:22:30 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * tests/mainloop-test.c (recurser_start): Add a bunch
+       of unrefs.
+
+       * gmain.c (g_source_attach): Reference the source
+       when adding (pointed out by Elliot)
+
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
 2000-12-08  Raja R Harinath  <harinath@cs.umn.edu>
 
        * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): 
index 853a0ad..a4d09b7 100644 (file)
@@ -122,6 +122,7 @@ g_io_add_watch_full (GIOChannel    *channel,
                     GDestroyNotify notify)
 {
   GSource *source;
                     GDestroyNotify notify)
 {
   GSource *source;
+  guint id;
   
   g_return_val_if_fail (channel != NULL, 0);
 
   
   g_return_val_if_fail (channel != NULL, 0);
 
@@ -131,7 +132,10 @@ g_io_add_watch_full (GIOChannel    *channel,
     g_source_set_priority (source, priority);
   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
 
     g_source_set_priority (source, priority);
   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
 
-  return g_source_attach (source, NULL);
+  id = g_source_attach (source, NULL);
+  g_source_unref (source);
+
+  return id;
 }
 
 guint 
 }
 
 guint 
index 853a0ad..a4d09b7 100644 (file)
@@ -122,6 +122,7 @@ g_io_add_watch_full (GIOChannel    *channel,
                     GDestroyNotify notify)
 {
   GSource *source;
                     GDestroyNotify notify)
 {
   GSource *source;
+  guint id;
   
   g_return_val_if_fail (channel != NULL, 0);
 
   
   g_return_val_if_fail (channel != NULL, 0);
 
@@ -131,7 +132,10 @@ g_io_add_watch_full (GIOChannel    *channel,
     g_source_set_priority (source, priority);
   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
 
     g_source_set_priority (source, priority);
   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
 
-  return g_source_attach (source, NULL);
+  id = g_source_attach (source, NULL);
+  g_source_unref (source);
+
+  return id;
 }
 
 guint 
 }
 
 guint 
index a197683..f9b26dd 100644 (file)
@@ -782,6 +782,7 @@ g_source_destroy_internal (GSource      *source,
   
   if (!SOURCE_DESTROYED (source))
     {
   
   if (!SOURCE_DESTROYED (source))
     {
+      GSList *tmp_list;
       gpointer old_cb_data;
       GSourceCallbackFuncs *old_cb_funcs;
       
       gpointer old_cb_data;
       GSourceCallbackFuncs *old_cb_funcs;
       
@@ -800,6 +801,13 @@ g_source_destroy_internal (GSource      *source,
          LOCK_CONTEXT (context);
        }
       
          LOCK_CONTEXT (context);
        }
       
+      tmp_list = source->poll_fds;
+      while (tmp_list)
+       {
+         g_main_context_remove_poll_unlocked (context, tmp_list->data);
+         tmp_list = tmp_list->next;
+       }
+      
       g_source_unref_internal (source, context, TRUE);
     }
 
       g_source_unref_internal (source, context, TRUE);
     }
 
@@ -894,7 +902,8 @@ g_source_add_poll (GSource *source,
   
   g_return_if_fail (source != NULL);
   g_return_if_fail (fd != NULL);
   
   g_return_if_fail (source != NULL);
   g_return_if_fail (fd != NULL);
-
+  g_return_val_if_fail (!SOURCE_DESTROYED (source), 0);
+  
   context = source->context;
 
   if (context)
   context = source->context;
 
   if (context)
@@ -1179,17 +1188,15 @@ g_source_unref_internal (GSource      *source,
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
          source->ref_count++;
        }
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
          source->ref_count++;
        }
-      else
-       {
-         g_source_list_remove (source, context);
-         
-         tmp_list = source->poll_fds;
-         while (tmp_list)
-           {
-             g_main_context_remove_poll_unlocked (context, tmp_list->data);
-             tmp_list = tmp_list->next;
-           }
-       }
+      else if (context)
+       g_source_list_remove (source, context);
+
+      if (source->source_funcs->destroy)
+       source->source_funcs->destroy (source);
+      
+      g_slist_free (source->poll_fds);
+      source->poll_fds = NULL;
+      g_free (source);
     }
   
   if (!have_lock && context)
     }
   
   if (!have_lock && context)
index 6357490..dd500c6 100644 (file)
@@ -71,7 +71,7 @@ struct _GSourceFuncs
   gboolean (*dispatch) (GSource    *source,
                        GSourceFunc callback,
                        gpointer    user_data);
   gboolean (*dispatch) (GSource    *source,
                        GSourceFunc callback,
                        gpointer    user_data);
-  void     (*destroy)  (GSource    *source);
+  void     (*destroy)  (GSource    *source); /* Can be NULL */
 };
 
 /* Any definitions using GPollFD or GPollFunc are primarily
 };
 
 /* Any definitions using GPollFD or GPollFunc are primarily
diff --git a/gmain.c b/gmain.c
index a197683..f9b26dd 100644 (file)
--- a/gmain.c
+++ b/gmain.c
@@ -782,6 +782,7 @@ g_source_destroy_internal (GSource      *source,
   
   if (!SOURCE_DESTROYED (source))
     {
   
   if (!SOURCE_DESTROYED (source))
     {
+      GSList *tmp_list;
       gpointer old_cb_data;
       GSourceCallbackFuncs *old_cb_funcs;
       
       gpointer old_cb_data;
       GSourceCallbackFuncs *old_cb_funcs;
       
@@ -800,6 +801,13 @@ g_source_destroy_internal (GSource      *source,
          LOCK_CONTEXT (context);
        }
       
          LOCK_CONTEXT (context);
        }
       
+      tmp_list = source->poll_fds;
+      while (tmp_list)
+       {
+         g_main_context_remove_poll_unlocked (context, tmp_list->data);
+         tmp_list = tmp_list->next;
+       }
+      
       g_source_unref_internal (source, context, TRUE);
     }
 
       g_source_unref_internal (source, context, TRUE);
     }
 
@@ -894,7 +902,8 @@ g_source_add_poll (GSource *source,
   
   g_return_if_fail (source != NULL);
   g_return_if_fail (fd != NULL);
   
   g_return_if_fail (source != NULL);
   g_return_if_fail (fd != NULL);
-
+  g_return_val_if_fail (!SOURCE_DESTROYED (source), 0);
+  
   context = source->context;
 
   if (context)
   context = source->context;
 
   if (context)
@@ -1179,17 +1188,15 @@ g_source_unref_internal (GSource      *source,
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
          source->ref_count++;
        }
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
          source->ref_count++;
        }
-      else
-       {
-         g_source_list_remove (source, context);
-         
-         tmp_list = source->poll_fds;
-         while (tmp_list)
-           {
-             g_main_context_remove_poll_unlocked (context, tmp_list->data);
-             tmp_list = tmp_list->next;
-           }
-       }
+      else if (context)
+       g_source_list_remove (source, context);
+
+      if (source->source_funcs->destroy)
+       source->source_funcs->destroy (source);
+      
+      g_slist_free (source->poll_fds);
+      source->poll_fds = NULL;
+      g_free (source);
     }
   
   if (!have_lock && context)
     }
   
   if (!have_lock && context)
diff --git a/gmain.h b/gmain.h
index 6357490..dd500c6 100644 (file)
--- a/gmain.h
+++ b/gmain.h
@@ -71,7 +71,7 @@ struct _GSourceFuncs
   gboolean (*dispatch) (GSource    *source,
                        GSourceFunc callback,
                        gpointer    user_data);
   gboolean (*dispatch) (GSource    *source,
                        GSourceFunc callback,
                        gpointer    user_data);
-  void     (*destroy)  (GSource    *source);
+  void     (*destroy)  (GSource    *source); /* Can be NULL */
 };
 
 /* Any definitions using GPollFD or GPollFunc are primarily
 };
 
 /* Any definitions using GPollFD or GPollFunc are primarily