Jacek Caban : server: Use file mode flags in async_handoff to decide if request is blocking.

Alexandre Julliard julliard at winehq.org
Wed Oct 31 15:58:33 CDT 2018


Module: wine
Branch: master
Commit: 43cdcc079445fc75b0559f54c4b96946074484d8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=43cdcc079445fc75b0559f54c4b96946074484d8

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Oct 31 16:45:04 2018 +0100

server: Use file mode flags in async_handoff to decide if request is blocking.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/pipe.c | 20 +++++++-------------
 server/async.c          |  4 ++--
 server/fd.c             |  8 ++++----
 server/file.h           |  2 +-
 4 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c
index fe65012..08bde6d 100644
--- a/dlls/ntdll/tests/pipe.c
+++ b/dlls/ntdll/tests/pipe.c
@@ -412,9 +412,9 @@ static void test_alertable(void)
     res = listen_pipe(hPipe, hEvent, &iosb, TRUE);
     todo_wine ok(res == STATUS_CANCELLED, "NtFsControlFile returned %x\n", res);
 
-    todo_wine ok(userapc_called, "user apc didn't run\n");
+    ok(userapc_called, "user apc didn't run\n");
     ok(U(iosb).Status == 0x55555555, "iosb.Status got changed to %x\n", U(iosb).Status);
-    todo_wine ok(WaitForSingleObjectEx(hEvent, 0, TRUE) == WAIT_TIMEOUT, "hEvent signaled\n");
+    ok(WaitForSingleObjectEx(hEvent, 0, TRUE) == WAIT_TIMEOUT, "hEvent signaled\n");
     ok(!ioapc_called, "IOAPC ran\n");
 
 /* queue an user apc from a different thread */
@@ -445,11 +445,11 @@ static void test_alertable(void)
     ok(hThread != INVALID_HANDLE_VALUE, "can't create thread, GetLastError: %x\n", GetLastError());
 
     res = listen_pipe(hPipe, hEvent, &iosb, TRUE);
-    todo_wine ok(!res, "NtFsControlFile returned %x\n", res);
+    ok(!res, "NtFsControlFile returned %x\n", res);
 
     ok(open_succeeded, "couldn't open client side pipe\n");
     ok(!U(iosb).Status, "Wrong iostatus %x\n", U(iosb).Status);
-    todo_wine ok(WaitForSingleObject(hEvent, 0) == 0, "hEvent not signaled\n");
+    ok(WaitForSingleObject(hEvent, 0) == 0, "hEvent not signaled\n");
 
     WaitForSingleObject(hThread, INFINITE);
     CloseHandle(hThread);
@@ -482,11 +482,11 @@ static void test_nonalertable(void)
     ok(ret, "can't queue user apc, GetLastError: %x\n", GetLastError());
 
     res = listen_pipe(hPipe, hEvent, &iosb, TRUE);
-    todo_wine ok(!res, "NtFsControlFile returned %x\n", res);
+    ok(!res, "NtFsControlFile returned %x\n", res);
 
     ok(open_succeeded, "couldn't open client side pipe\n");
-    todo_wine ok(!U(iosb).Status, "Wrong iostatus %x\n", U(iosb).Status);
-    todo_wine ok(WaitForSingleObject(hEvent, 0) == 0, "hEvent not signaled\n");
+    ok(!U(iosb).Status, "Wrong iostatus %x\n", U(iosb).Status);
+    ok(WaitForSingleObject(hEvent, 0) == 0, "hEvent not signaled\n");
 
     ok(!ioapc_called, "IOAPC ran too early\n");
     ok(!userapc_called, "user apc ran too early\n");
@@ -1348,7 +1348,6 @@ static void test_completion(void)
 
     ok(is_signaled(client), "client is not signaled\n");
 
-    if (broken(1)) { /* blocks on wine */
     /* no event, APC nor completion: only signals on handle */
     memset(&io, 0xcc, sizeof(io));
     status = NtReadFile(client, NULL, NULL, NULL, &io, read_buf, sizeof(read_buf), NULL, NULL);
@@ -1360,7 +1359,6 @@ static void test_completion(void)
     ok(is_signaled(client), "client is signaled\n");
     ok(io.Status == STATUS_SUCCESS, "Status = %x\n", io.Status);
     ok(io.Information == sizeof(buf), "Information = %lu\n", io.Information);
-    }
 
     /* event with no APC nor completion: signals only event */
     memset(&io, 0xcc, sizeof(io));
@@ -1434,12 +1432,10 @@ static void test_completion(void)
     ok(!is_signaled(client), "client is signaled\n");
     test_queued_completion(port, &io, STATUS_SUCCESS, sizeof(buf));
 
-    if (broken(1)) { /* blocks on wine */
     memset(&io, 0xcc, sizeof(io));
     status = NtReadFile(client, NULL, NULL, NULL, &io, read_buf, sizeof(read_buf), NULL, NULL);
     ok(status == STATUS_PENDING, "status = %x\n", status);
     ok(!is_signaled(client), "client is signaled\n");
-    }
 
     ret = WriteFile(client, buf, 1, &num_bytes, NULL);
     ok(ret, "WriteFile failed, error %u\n", GetLastError());
@@ -1575,9 +1571,7 @@ static void test_blocking(ULONG options)
     SetEvent(ctx.wait);
     status = NtReadFile(ctx.client, ctx.event, ioapc, &io, &io, read_buf,
                         sizeof(read_buf), NULL, NULL);
-    todo_wine
     ok(status == STATUS_SUCCESS, "status = %x\n", status);
-    if (status == STATUS_PENDING) WaitForSingleObject(ctx.event, INFINITE);
     ok(io.Status == STATUS_SUCCESS, "Status = %x\n", io.Status);
     ok(io.Information == 1, "Information = %lu\n", io.Information);
     ok(is_signaled(ctx.event), "event is not signaled\n");
diff --git a/server/async.c b/server/async.c
index f2674bb..cadeda3 100644
--- a/server/async.c
+++ b/server/async.c
@@ -284,7 +284,7 @@ struct async *create_request_async( struct fd *fd, unsigned int comp_flags, cons
 }
 
 /* return async object status and wait handle to client */
-obj_handle_t async_handoff( struct async *async, int success, data_size_t *result )
+obj_handle_t async_handoff( struct async *async, int success, data_size_t *result, int force_blocking )
 {
     if (!success)
     {
@@ -316,7 +316,7 @@ obj_handle_t async_handoff( struct async *async, int success, data_size_t *resul
     else
     {
         async->direct_result = 0;
-        if (!async_is_blocking( async ))
+        if (!force_blocking && async->fd && is_fd_overlapped( async->fd ))
         {
             close_handle( async->thread->process, async->wait_handle);
             async->wait_handle = 0;
diff --git a/server/fd.c b/server/fd.c
index eba3256..119fae6 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -2438,7 +2438,7 @@ DECL_HANDLER(flush)
 
     if ((async = create_request_async( fd, fd->comp_flags, &req->async )))
     {
-        reply->event = async_handoff( async, fd->fd_ops->flush( fd, async ), NULL );
+        reply->event = async_handoff( async, fd->fd_ops->flush( fd, async ), NULL, 1 );
         release_object( async );
     }
     release_object( fd );
@@ -2537,7 +2537,7 @@ DECL_HANDLER(read)
 
     if ((async = create_request_async( fd, fd->comp_flags, &req->async )))
     {
-        reply->wait    = async_handoff( async, fd->fd_ops->read( fd, async, req->pos ), NULL );
+        reply->wait    = async_handoff( async, fd->fd_ops->read( fd, async, req->pos ), NULL, 0 );
         reply->options = fd->options;
         release_object( async );
     }
@@ -2554,7 +2554,7 @@ DECL_HANDLER(write)
 
     if ((async = create_request_async( fd, fd->comp_flags, &req->async )))
     {
-        reply->wait    = async_handoff( async, fd->fd_ops->write( fd, async, req->pos ), &reply->size );
+        reply->wait    = async_handoff( async, fd->fd_ops->write( fd, async, req->pos ), &reply->size, 0 );
         reply->options = fd->options;
         release_object( async );
     }
@@ -2572,7 +2572,7 @@ DECL_HANDLER(ioctl)
 
     if ((async = create_request_async( fd, fd->comp_flags, &req->async )))
     {
-        reply->wait    = async_handoff( async, fd->fd_ops->ioctl( fd, req->code, async ), NULL );
+        reply->wait    = async_handoff( async, fd->fd_ops->ioctl( fd, req->code, async ), NULL, 0 );
         reply->options = fd->options;
         release_object( async );
     }
diff --git a/server/file.h b/server/file.h
index a9581a7..6b67866 100644
--- a/server/file.h
+++ b/server/file.h
@@ -187,7 +187,7 @@ extern struct object *create_serial( struct fd *fd );
 extern void free_async_queue( struct async_queue *queue );
 extern struct async *create_async( struct fd *fd, struct thread *thread, const async_data_t *data, struct iosb *iosb );
 extern struct async *create_request_async( struct fd *fd, unsigned int comp_flags, const async_data_t *data );
-extern obj_handle_t async_handoff( struct async *async, int success, data_size_t *result );
+extern obj_handle_t async_handoff( struct async *async, int success, data_size_t *result, int force_blocking );
 extern void queue_async( struct async_queue *queue, struct async *async );
 extern void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status );
 extern void async_set_result( struct object *obj, unsigned int status, apc_param_t total );




More information about the wine-cvs mailing list