From 6db03d73a45bc0acae0bb96849733bf0ab7ad454 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 11 Aug 2009 18:50:28 +0200 Subject: [PATCH] When creating a pipe for a cancelled cancellable, write to it Includes (untested) fix for win32 that calls SetEvent() in that case. --- gio/gcancellable.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gio/gcancellable.c b/gio/gcancellable.c index f5b5c4ca..209f5f14 100644 --- a/gio/gcancellable.c +++ b/gio/gcancellable.c @@ -226,6 +226,7 @@ set_fd_close_exec (int fd) static void g_cancellable_open_pipe (GCancellable *cancellable) { + const char ch = 'x'; GCancellablePrivate *priv; priv = cancellable->priv; @@ -238,6 +239,9 @@ g_cancellable_open_pipe (GCancellable *cancellable) set_fd_nonblocking (priv->cancel_pipe[1]); set_fd_close_exec (priv->cancel_pipe[0]); set_fd_close_exec (priv->cancel_pipe[1]); + + if (priv->cancelled) + write (priv->cancel_pipe[1], &ch, 1); } } #endif @@ -371,7 +375,6 @@ g_cancellable_reset (GCancellable *cancellable) #ifdef G_OS_WIN32 if (priv->event) ResetEvent (priv->event); - else #endif if (priv->cancel_pipe[0] != -1) read (priv->cancel_pipe[0], &ch, 1); @@ -520,8 +523,9 @@ g_cancellable_make_pollfd (GCancellable *cancellable, GPollFD *pollfd) G_UNLOCK(cancellable); return FALSE; } + if (priv->cancelled) + SetEvent(priv->event); } - priv->fd_refcount++; G_UNLOCK(cancellable); -- 2.34.1