Unref callback->cb_data if it was still set when the source is freed.
authorOwen Taylor <otaylor@redhat.com>
Wed, 3 Jan 2001 16:05:39 +0000 (16:05 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Wed, 3 Jan 2001 16:05:39 +0000 (16:05 +0000)
Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>

* gmain.c (g_source_unref_internal): Unref callback->cb_data
if it was still set when the source is freed. (Usually, this
will be done by g_source_destroy.)

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

index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 0fb944438deb9d02cd7929176c6aa163116a1fdc..32fd7d2be19ac15980b4d9c49bce42cfd853bac9 100644 (file)
@@ -1,3 +1,9 @@
+Wed Dec 13 20:41:49 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gmain.c (g_source_unref_internal): Unref callback->cb_data
+       if it was still set when the source is freed. (Usually, this
+       will be done by g_source_destroy.)
+
 2001-01-02  Dan Winship  <danw@helixcode.com>
 
        * garray.h (g_array_append_val, g_array_prepend_val,
index 5f2e2a72609f96a655ce887ef816e30d430e261d..61957e213d43b08052001b49aad1937d10ce72e0 100644 (file)
@@ -1173,9 +1173,8 @@ g_source_unref_internal (GSource      *source,
                         GMainContext *context,
                         gboolean      have_lock)
 {
-  gpointer cb_data = NULL;
-  GSourceCallbackFuncs *cb_funcs = NULL;
-  GSList *tmp_list;
+  gpointer old_cb_data = NULL;
+  GSourceCallbackFuncs *old_cb_funcs = NULL;
 
   g_return_if_fail (source != NULL);
   
@@ -1185,6 +1184,12 @@ g_source_unref_internal (GSource      *source,
   source->ref_count--;
   if (source->ref_count == 0)
     {
+      old_cb_data = source->callback_data;
+      old_cb_funcs = source->callback_funcs;
+
+      source->callback_data = NULL;
+      source->callback_funcs = NULL;
+
       if (context && !SOURCE_DESTROYED (source))
        {
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
@@ -1204,12 +1209,12 @@ g_source_unref_internal (GSource      *source,
   if (!have_lock && context)
     UNLOCK_CONTEXT (context);
 
-  if (cb_data)
+  if (old_cb_funcs)
     {
       if (have_lock)
        UNLOCK_CONTEXT (context);
       
-      cb_funcs->unref (cb_data);
+      old_cb_funcs->unref (old_cb_data);
 
       if (have_lock)
        LOCK_CONTEXT (context);
diff --git a/gmain.c b/gmain.c
index 5f2e2a72609f96a655ce887ef816e30d430e261d..61957e213d43b08052001b49aad1937d10ce72e0 100644 (file)
--- a/gmain.c
+++ b/gmain.c
@@ -1173,9 +1173,8 @@ g_source_unref_internal (GSource      *source,
                         GMainContext *context,
                         gboolean      have_lock)
 {
-  gpointer cb_data = NULL;
-  GSourceCallbackFuncs *cb_funcs = NULL;
-  GSList *tmp_list;
+  gpointer old_cb_data = NULL;
+  GSourceCallbackFuncs *old_cb_funcs = NULL;
 
   g_return_if_fail (source != NULL);
   
@@ -1185,6 +1184,12 @@ g_source_unref_internal (GSource      *source,
   source->ref_count--;
   if (source->ref_count == 0)
     {
+      old_cb_data = source->callback_data;
+      old_cb_funcs = source->callback_funcs;
+
+      source->callback_data = NULL;
+      source->callback_funcs = NULL;
+
       if (context && !SOURCE_DESTROYED (source))
        {
          g_warning (G_STRLOC ": ref_count == 0, but source is still attached to a context!");
@@ -1204,12 +1209,12 @@ g_source_unref_internal (GSource      *source,
   if (!have_lock && context)
     UNLOCK_CONTEXT (context);
 
-  if (cb_data)
+  if (old_cb_funcs)
     {
       if (have_lock)
        UNLOCK_CONTEXT (context);
       
-      cb_funcs->unref (cb_data);
+      old_cb_funcs->unref (old_cb_data);
 
       if (have_lock)
        LOCK_CONTEXT (context);