[gio] minor improvements to g_cancellable_cancel()
authorBenjamin Otte <otte@gnome.org>
Sun, 5 Jul 2009 19:34:39 +0000 (21:34 +0200)
committerBenjamin Otte <otte@gnome.org>
Sun, 5 Jul 2009 19:36:03 +0000 (21:36 +0200)
- make this function not crash when cancellable is NULL
- avoid locking when the cancellable has already been cancelled

gio/gcancellable.c

index 888032d..8654883 100644 (file)
@@ -514,27 +514,27 @@ g_cancellable_make_pollfd (GCancellable *cancellable, GPollFD *pollfd)
 void
 g_cancellable_cancel (GCancellable *cancellable)
 {
+  static const char ch = 'x';
   gboolean cancel;
   GCancellablePrivate *priv;
 
+  if (cancellable == NULL ||
+      priv->cancelled)
+    return;
+
   priv = cancellable->priv;
   cancel = FALSE;
 
   G_LOCK(cancellable);
-  if (cancellable != NULL &&
-      !priv->cancelled)
-    {
-      char ch = 'x';
-      cancel = TRUE;
-      priv->cancelled = TRUE;
-      priv->cancelled_running = TRUE;
+  cancel = TRUE;
+  priv->cancelled = TRUE;
+  priv->cancelled_running = TRUE;
 #ifdef G_OS_WIN32
-      if (priv->event)
-       SetEvent(priv->event);
+  if (priv->event)
+    SetEvent(priv->event);
 #endif
-      if (priv->cancel_pipe[1] != -1)
-       write (priv->cancel_pipe[1], &ch, 1);
-    }
+  if (priv->cancel_pipe[1] != -1)
+    write (priv->cancel_pipe[1], &ch, 1);
   G_UNLOCK(cancellable);
 
   if (cancel)