Make cancellation threadsafe (i.e. guarantee its only done once, and
authorAlexander Larsson <alexl@redhat.com>
Wed, 5 Mar 2008 11:50:27 +0000 (11:50 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Wed, 5 Mar 2008 11:50:27 +0000 (11:50 +0000)
2008-03-05  Alexander Larsson  <alexl@redhat.com>

        * gfilemonitor.c:
Make cancellation threadsafe (i.e.
guarantee its only done once, and always
done)

        * glocaldirectorymonitor.c:
Make sure we the monitor lives while the
mounts_changed callback is being called (#520484)

svn path=/trunk/; revision=6630

gio/ChangeLog
gio/gfilemonitor.c
gio/glocaldirectorymonitor.c

index 92a0f23..9376039 100644 (file)
@@ -1,3 +1,14 @@
+2008-03-05  Alexander Larsson  <alexl@redhat.com>
+
+        * gfilemonitor.c:
+       Make cancellation threadsafe (i.e.
+       guarantee its only done once, and always
+       done)
+       
+        * glocaldirectorymonitor.c:
+       Make sure we the monitor lives while the
+       mounts_changed callback is being called (#520484)
+
 2008-03-04  Wouter Bolsterlee  <wbolster@svn.gnome.org>
 
        * gbufferedinputstream.c: Fix typo in parameter
index 105f1a8..dd985ee 100644 (file)
@@ -45,6 +45,8 @@
  * are monitoring, connect to the #GFileMonitor::changed signal.
  **/
 
+G_LOCK_DEFINE_STATIC(cancelled);
+
 enum {
   CHANGED,
   LAST_SIGNAL
@@ -117,7 +119,9 @@ g_file_monitor_get_property (GObject    *object,
       break;
 
     case PROP_CANCELLED:
+      G_LOCK (cancelled);
       g_value_set_boolean (value, priv->cancelled);
+      G_UNLOCK (cancelled);
       break;
 
     default:
@@ -165,8 +169,7 @@ g_file_monitor_dispose (GObject *object)
   monitor = G_FILE_MONITOR (object);
 
   /* Make sure we cancel on last unref */
-  if (!monitor->priv->cancelled)
-    g_file_monitor_cancel (monitor);
+  g_file_monitor_cancel (monitor);
   
   if (G_OBJECT_CLASS (g_file_monitor_parent_class)->dispose)
     (*G_OBJECT_CLASS (g_file_monitor_parent_class)->dispose) (object);
@@ -247,8 +250,13 @@ gboolean
 g_file_monitor_is_cancelled (GFileMonitor *monitor)
 {
   g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE);
+  gboolean res;
 
-  return monitor->priv->cancelled;
+  G_LOCK (cancelled);
+  res = monitor->priv->cancelled;
+  G_UNLOCK (cancelled);
+  
+  return res;
 }
 
 /**
@@ -266,10 +274,16 @@ g_file_monitor_cancel (GFileMonitor* monitor)
   
   g_return_val_if_fail (G_IS_FILE_MONITOR (monitor), FALSE);
   
+  G_LOCK (cancelled);
   if (monitor->priv->cancelled)
-    return TRUE;
+    {
+      G_UNLOCK (cancelled);
+      return TRUE;
+    }
   
   monitor->priv->cancelled = TRUE;
+  G_UNLOCK (cancelled);
+  
   g_object_notify (G_OBJECT (monitor), "cancelled");
 
   klass = G_FILE_MONITOR_GET_CLASS (monitor);
index bd59af5..2d0cb59 100644 (file)
@@ -128,8 +128,8 @@ g_local_directory_monitor_constructor (GType                  type,
         g_unix_mount_free (mount);
 
       local_monitor->mount_monitor = g_unix_mount_monitor_new ();
-      g_signal_connect (local_monitor->mount_monitor, "mounts_changed",
-        G_CALLBACK (mounts_changed), local_monitor);
+      g_signal_connect_object (local_monitor->mount_monitor, "mounts_changed",
+                              G_CALLBACK (mounts_changed), local_monitor, 0);
 #endif
     }