[PATCH 3/4] server: Don't block when writing to named pipes in PIPE_NOWAIT mode.

Brendan Shanks bshanks at codeweavers.com
Tue Oct 1 11:16:59 CDT 2019


Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
---
 dlls/kernel32/tests/pipe.c |  4 ++--
 server/named_pipe.c        | 12 +++++++-----
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 7f2a6adca1..d5e516fe7d 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -3956,8 +3956,8 @@ static void test_nowait(void)
     /* WriteFile only documents that 'write < sizeof(readbuf)' for this case, but Windows
      * doesn't seem to do partial writes ('write == 0' always)
      */
-    todo_wine ok(write < sizeof(readbuf), "WriteFile should fail to write the whole buffer\n");
-    todo_wine ok(write == 0, "WriteFile shouldn't do partial writes\n");
+    ok(write < sizeof(readbuf), "WriteFile should fail to write the whole buffer\n");
+    ok(write == 0, "WriteFile shouldn't do partial writes\n");
     ok(CloseHandle(hThread), "CloseHandle for the thread failed\n");
     ok(CloseHandle(pipewrite), "CloseHandle for the write pipe failed\n");
     ok(CloseHandle(piperead), "CloseHandle for the read pipe failed\n");
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 6926712b8c..d5716f1a1a 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -363,7 +363,7 @@ static struct pipe_message *queue_message( struct pipe_end *pipe_end, struct ios
     return message;
 }
 
-static void wake_message( struct pipe_message *message )
+static void wake_message( struct pipe_message *message, data_size_t result )
 {
     struct async *async = message->async;
 
@@ -371,7 +371,7 @@ static void wake_message( struct pipe_message *message )
     if (!async) return;
 
     message->iosb->status = STATUS_SUCCESS;
-    message->iosb->result = message->iosb->in_size;
+    message->iosb->result = result;
     async_terminate( async, message->iosb->result ? STATUS_ALERTED : STATUS_SUCCESS );
     release_object( async );
 }
@@ -749,7 +749,7 @@ static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
     {
         iosb->out_data = message->iosb->in_data;
         message->iosb->in_data = NULL;
-        wake_message( message );
+        wake_message( message, message->iosb->in_size );
         free_message( message );
     }
     else
@@ -773,7 +773,7 @@ static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
             message->read_pos += writing;
             if (message->read_pos == message->iosb->in_size)
             {
-                wake_message(message);
+                wake_message(message, message->iosb->in_size);
                 free_message(message);
             }
         } while (write_pos < iosb->out_size);
@@ -836,7 +836,9 @@ static void reselect_write_queue( struct pipe_end *pipe_end )
         {
             avail += message->iosb->in_size - message->read_pos;
             if (message->async && (avail <= reader->buffer_size || !message->iosb->in_size))
-                wake_message( message );
+                wake_message( message, message->iosb->in_size );
+            else if (message->async && (pipe_end->flags & NAMED_PIPE_NONBLOCKING_MODE))
+                wake_message( message, 0 );
         }
     }
 
-- 
2.17.1




More information about the wine-devel mailing list