Jinoh Kang : server: Add mark_pending field to set_async_direct_result request.
Alexandre Julliard
julliard at winehq.org
Tue Mar 22 16:46:29 CDT 2022
Module: wine
Branch: master
Commit: be9a875fc17b81df9abfc85073d6134cb59436fa
URL: https://source.winehq.org/git/wine.git/?a=commit;h=be9a875fc17b81df9abfc85073d6134cb59436fa
Author: Jinoh Kang <jinoh.kang.kr at gmail.com>
Date: Sun Mar 20 07:28:27 2022 +0900
server: Add mark_pending field to set_async_direct_result request.
The client can set mark_pending to indicate that the full-blown I/O
completion mechanism shall be triggered (asynchronous completion) even
if the status indicates failure.
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntdll/unix/socket.c | 2 +-
dlls/ntdll/unix/sync.c | 9 +++++----
dlls/ntdll/unix/unix_private.h | 2 +-
include/wine/server_protocol.h | 4 ++--
server/async.c | 11 ++++++++---
server/protocol.def | 1 +
server/request.h | 1 +
server/trace.c | 1 +
8 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 23059e3cff8..2f8bd6e62bf 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -767,7 +767,7 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi
release_fileio( &async->io );
}
- if (alerted) set_async_direct_result( &wait_handle, status, information );
+ if (alerted) set_async_direct_result( &wait_handle, status, information, FALSE );
if (wait_handle) status = wait_async( wait_handle, options & FILE_SYNCHRONOUS_IO_ALERT );
return status;
}
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
index ee25dfd0099..0786454dad2 100644
--- a/dlls/ntdll/unix/sync.c
+++ b/dlls/ntdll/unix/sync.c
@@ -2514,7 +2514,7 @@ NTSTATUS WINAPI NtWaitForAlertByThreadId( const void *address, const LARGE_INTEG
/* Notify direct completion of async and close the wait handle if it is no longer needed.
* This function is a no-op (returns status as-is) if the supplied handle is NULL.
*/
-void set_async_direct_result( HANDLE *optional_handle, NTSTATUS status, ULONG_PTR information )
+void set_async_direct_result( HANDLE *optional_handle, NTSTATUS status, ULONG_PTR information, BOOL mark_pending )
{
NTSTATUS ret;
@@ -2522,9 +2522,10 @@ void set_async_direct_result( HANDLE *optional_handle, NTSTATUS status, ULONG_PT
SERVER_START_REQ( set_async_direct_result )
{
- req->handle = wine_server_obj_handle( *optional_handle );
- req->status = status;
- req->information = information;
+ req->handle = wine_server_obj_handle( *optional_handle );
+ req->status = status;
+ req->information = information;
+ req->mark_pending = mark_pending;
ret = wine_server_call( req );
if (ret == STATUS_SUCCESS)
*optional_handle = wine_server_ptr_handle( reply->handle );
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h
index 434f98cdc5a..86e87e6e29a 100644
--- a/dlls/ntdll/unix/unix_private.h
+++ b/dlls/ntdll/unix/unix_private.h
@@ -274,7 +274,7 @@ extern NTSTATUS get_device_info( int fd, struct _FILE_FS_DEVICE_INFORMATION *inf
extern void init_files(void) DECLSPEC_HIDDEN;
extern void init_cpu_info(void) DECLSPEC_HIDDEN;
extern void add_completion( HANDLE handle, ULONG_PTR value, NTSTATUS status, ULONG info, BOOL async ) DECLSPEC_HIDDEN;
-extern void set_async_direct_result( HANDLE *optional_handle, NTSTATUS status, ULONG_PTR information );
+extern void set_async_direct_result( HANDLE *optional_handle, NTSTATUS status, ULONG_PTR information, BOOL mark_pending );
extern void dbg_init(void) DECLSPEC_HIDDEN;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index e32ef8e1479..75b48d7601c 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -2913,7 +2913,7 @@ struct set_async_direct_result_request
obj_handle_t handle;
apc_param_t information;
unsigned int status;
- char __pad_28[4];
+ int mark_pending;
};
struct set_async_direct_result_reply
{
@@ -6284,7 +6284,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 746
+#define SERVER_PROTOCOL_VERSION 747
/* ### protocol_version end ### */
diff --git a/server/async.c b/server/async.c
index d49fb8b7c04..a92798fcd39 100644
--- a/server/async.c
+++ b/server/async.c
@@ -772,10 +772,15 @@ DECL_HANDLER(set_async_direct_result)
async->direct_result = 0;
async->pending = 1;
}
+ else if (req->mark_pending)
+ {
+ async->pending = 1;
+ }
- /* if the I/O has completed successfully, the client would have already
- * set the IOSB. therefore, we can skip waiting on wait_handle and do
- * async_set_result() directly.
+ /* if the I/O has completed successfully (or unsuccessfully, and
+ * async->pending is set), the client would have already set the IOSB.
+ * therefore, we can do async_set_result() directly and let the client skip
+ * waiting on wait_handle.
*/
async_set_result( &async->obj, status, req->information );
diff --git a/server/protocol.def b/server/protocol.def
index 9d90544fa41..66c6c97b1e0 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2168,6 +2168,7 @@ enum message_type
obj_handle_t handle; /* wait handle */
apc_param_t information; /* IO_STATUS_BLOCK Information */
unsigned int status; /* completion status */
+ int mark_pending; /* set async to pending before completion? */
@REPLY
obj_handle_t handle; /* wait handle, or NULL if closed */
@END
diff --git a/server/request.h b/server/request.h
index 2c7889bd197..434041490c0 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1401,6 +1401,7 @@ C_ASSERT( sizeof(struct get_async_result_reply) == 8 );
C_ASSERT( FIELD_OFFSET(struct set_async_direct_result_request, handle) == 12 );
C_ASSERT( FIELD_OFFSET(struct set_async_direct_result_request, information) == 16 );
C_ASSERT( FIELD_OFFSET(struct set_async_direct_result_request, status) == 24 );
+C_ASSERT( FIELD_OFFSET(struct set_async_direct_result_request, mark_pending) == 28 );
C_ASSERT( sizeof(struct set_async_direct_result_request) == 32 );
C_ASSERT( FIELD_OFFSET(struct set_async_direct_result_reply, handle) == 8 );
C_ASSERT( sizeof(struct set_async_direct_result_reply) == 16 );
diff --git a/server/trace.c b/server/trace.c
index 61e592b0ffa..75bc35b6b56 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2763,6 +2763,7 @@ static void dump_set_async_direct_result_request( const struct set_async_direct_
fprintf( stderr, " handle=%04x", req->handle );
dump_uint64( ", information=", &req->information );
fprintf( stderr, ", status=%08x", req->status );
+ fprintf( stderr, ", mark_pending=%d", req->mark_pending );
}
static void dump_set_async_direct_result_reply( const struct set_async_direct_result_reply *req )
More information about the wine-cvs
mailing list