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:
+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):
+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):
+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):
+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):
+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):
+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):
+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):
+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):
GDestroyNotify notify)
{
GSource *source;
GDestroyNotify notify)
{
GSource *source;
g_return_val_if_fail (channel != NULL, 0);
g_return_val_if_fail (channel != NULL, 0);
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;
GDestroyNotify notify)
{
GSource *source;
GDestroyNotify notify)
{
GSource *source;
g_return_val_if_fail (channel != NULL, 0);
g_return_val_if_fail (channel != NULL, 0);
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;
if (!SOURCE_DESTROYED (source))
{
if (!SOURCE_DESTROYED (source))
{
gpointer old_cb_data;
GSourceCallbackFuncs *old_cb_funcs;
gpointer old_cb_data;
GSourceCallbackFuncs *old_cb_funcs;
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);
}
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)
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)
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
if (!SOURCE_DESTROYED (source))
{
if (!SOURCE_DESTROYED (source))
{
gpointer old_cb_data;
GSourceCallbackFuncs *old_cb_funcs;
gpointer old_cb_data;
GSourceCallbackFuncs *old_cb_funcs;
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);
}
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)
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)
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