From: Owen Taylor Date: Sun, 10 Dec 2000 16:02:48 +0000 (+0000) Subject: Remove pollfds from the context here, not when actually freeing the X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=cbd74878d1ff8d218e9854fe5b42bfdad3397aca;p=dana%2Fcg-glib.git Remove pollfds from the context here, not when actually freeing the Sun Dec 10 10:47:11 2000 Owen Taylor * 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. --- diff --git a/ChangeLog b/ChangeLog index 28adbe91..5b831371 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 28adbe91..5b831371 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,22 @@ +Sun Dec 10 10:47:11 2000 Owen Taylor + + * 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 + + * 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 * acglib.m4 (GLIB_AC_DIVERT_BEFORE_HELP): diff --git a/giochannel.c b/giochannel.c index 853a0adc..a4d09b74 100644 --- a/giochannel.c +++ b/giochannel.c @@ -122,6 +122,7 @@ g_io_add_watch_full (GIOChannel *channel, GDestroyNotify notify) { GSource *source; + guint id; 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); - return g_source_attach (source, NULL); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; } guint diff --git a/glib/giochannel.c b/glib/giochannel.c index 853a0adc..a4d09b74 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -122,6 +122,7 @@ g_io_add_watch_full (GIOChannel *channel, GDestroyNotify notify) { GSource *source; + guint id; 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); - return g_source_attach (source, NULL); + id = g_source_attach (source, NULL); + g_source_unref (source); + + return id; } guint diff --git a/glib/gmain.c b/glib/gmain.c index a197683a..f9b26dd1 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -782,6 +782,7 @@ g_source_destroy_internal (GSource *source, if (!SOURCE_DESTROYED (source)) { + GSList *tmp_list; gpointer old_cb_data; GSourceCallbackFuncs *old_cb_funcs; @@ -800,6 +801,13 @@ g_source_destroy_internal (GSource *source, 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); } @@ -894,7 +902,8 @@ g_source_add_poll (GSource *source, 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) @@ -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++; } - 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) diff --git a/glib/gmain.h b/glib/gmain.h index 63574902..dd500c6e 100644 --- a/glib/gmain.h +++ b/glib/gmain.h @@ -71,7 +71,7 @@ struct _GSourceFuncs 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 diff --git a/gmain.c b/gmain.c index a197683a..f9b26dd1 100644 --- a/gmain.c +++ b/gmain.c @@ -782,6 +782,7 @@ g_source_destroy_internal (GSource *source, if (!SOURCE_DESTROYED (source)) { + GSList *tmp_list; gpointer old_cb_data; GSourceCallbackFuncs *old_cb_funcs; @@ -800,6 +801,13 @@ g_source_destroy_internal (GSource *source, 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); } @@ -894,7 +902,8 @@ g_source_add_poll (GSource *source, 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) @@ -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++; } - 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) diff --git a/gmain.h b/gmain.h index 63574902..dd500c6e 100644 --- a/gmain.h +++ b/gmain.h @@ -71,7 +71,7 @@ struct _GSourceFuncs 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