Alexandre Julliard : ntdll: Add a helper function for registering a file read async I/O.
Alexandre Julliard
julliard at winehq.org
Mon Dec 19 13:10:38 CST 2016
Module: wine
Branch: stable
Commit: dfc3ae752839daa9a3d05b1a0faf19cd3006f629
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dfc3ae752839daa9a3d05b1a0faf19cd3006f629
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jun 9 15:31:00 2016 +0900
ntdll: Add a helper function for registering a file read async I/O.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 7a8ebc828e763284fdda027dcdf135cc01a58dff)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/ntdll/file.c | 66 ++++++++++++++++++++++++++++++++-----------------------
1 file changed, 38 insertions(+), 28 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 668ebbf..ede0ec1 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -782,6 +782,42 @@ static NTSTATUS get_io_avail_mode( HANDLE handle, enum server_fd_type type, BOOL
return status;
}
+/* register an async I/O for a file read; helper for NtReadFile */
+static NTSTATUS register_async_file_read( HANDLE handle, HANDLE event,
+ PIO_APC_ROUTINE apc, void *apc_user,
+ IO_STATUS_BLOCK *iosb, void *buffer,
+ ULONG already, ULONG length, BOOL avail_mode )
+{
+ ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_user;
+ struct async_fileio_read *fileio;
+ NTSTATUS status;
+
+ if (!(fileio = (struct async_fileio_read *)alloc_fileio( sizeof(*fileio), handle, apc, apc_user )))
+ return STATUS_NO_MEMORY;
+
+ fileio->already = already;
+ fileio->count = length;
+ fileio->buffer = buffer;
+ fileio->avail_mode = avail_mode;
+
+ SERVER_START_REQ( register_async )
+ {
+ req->type = ASYNC_TYPE_READ;
+ req->count = length;
+ req->async.handle = wine_server_obj_handle( handle );
+ req->async.event = wine_server_obj_handle( event );
+ req->async.callback = wine_server_client_ptr( FILE_AsyncReadService );
+ req->async.iosb = wine_server_client_ptr( iosb );
+ req->async.arg = wine_server_client_ptr( fileio );
+ req->async.cvalue = cvalue;
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+
+ if (status != STATUS_PENDING) RtlFreeHeap( GetProcessHeap(), 0, fileio );
+ return status;
+}
+
/******************************************************************************
* NtReadFile [NTDLL.@]
@@ -918,7 +954,6 @@ NTSTATUS WINAPI NtReadFile(HANDLE hFile, HANDLE hEvent,
if (async_read)
{
- struct async_fileio_read *fileio;
BOOL avail_mode;
if ((status = get_io_avail_mode( hFile, type, &avail_mode )))
@@ -928,33 +963,8 @@ NTSTATUS WINAPI NtReadFile(HANDLE hFile, HANDLE hEvent,
status = STATUS_SUCCESS;
goto done;
}
-
- fileio = (struct async_fileio_read *)alloc_fileio( sizeof(*fileio), hFile, apc, apc_user );
- if (!fileio)
- {
- status = STATUS_NO_MEMORY;
- goto err;
- }
- fileio->already = total;
- fileio->count = length;
- fileio->buffer = buffer;
- fileio->avail_mode = avail_mode;
-
- SERVER_START_REQ( register_async )
- {
- req->type = ASYNC_TYPE_READ;
- req->count = length;
- req->async.handle = wine_server_obj_handle( hFile );
- req->async.event = wine_server_obj_handle( hEvent );
- req->async.callback = wine_server_client_ptr( FILE_AsyncReadService );
- req->async.iosb = wine_server_client_ptr( io_status );
- req->async.arg = wine_server_client_ptr( fileio );
- req->async.cvalue = cvalue;
- status = wine_server_call( req );
- }
- SERVER_END_REQ;
-
- if (status != STATUS_PENDING) RtlFreeHeap( GetProcessHeap(), 0, fileio );
+ status = register_async_file_read( hFile, hEvent, apc, apc_user, io_status,
+ buffer, total, length, avail_mode );
goto err;
}
else /* synchronous read, wait for the fd to become ready */
More information about the wine-cvs
mailing list