From: Jinoh Kang Subject: [RFC PATCH v2 08/11] ntdll: Add a helper to process APC and wait for async in one function call. Message-Id: <55826906-de07-76ff-f951-cb83f364c93f@gmail.com> Date: Sat, 22 Jan 2022 23:36:53 +0900 In-Reply-To: <1e0d520b-0f60-1323-3305-4f884fb121a1@gmail.com> References: <1e0d520b-0f60-1323-3305-4f884fb121a1@gmail.com> Signed-off-by: Jinoh Kang --- Notes: This essentially replaces the signal_wait_async() function from the previous patch serie. dlls/ntdll/unix/sync.c | 19 +++++++++++++++++++ dlls/ntdll/unix/unix_private.h | 1 + 2 files changed, 20 insertions(+) diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index 8fe1e1145e7..05c27cfb5e4 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -2510,3 +2510,22 @@ NTSTATUS WINAPI NtWaitForAlertByThreadId( const void *address, const LARGE_INTEG } #endif + +NTSTATUS wait_async_after_apc( HANDLE optional_handle, BOOL alertable, NTSTATUS prev_status, const inline_apc_t *inline_apc ) +{ + select_op_t select_op; + UINT flags = SELECT_INTERRUPTIBLE; + + if (alertable) flags |= SELECT_ALERTABLE; + + if (!optional_handle) + { + static const LARGE_INTEGER zero = {{ 0 }}; + server_wait( NULL, 0, flags, &zero, inline_apc ); + return prev_status; + } + + select_op.wait.op = SELECT_WAIT_ALL; + select_op.wait.handles[0] = wine_server_obj_handle( optional_handle ); + return server_wait( &select_op, offsetof( select_op_t, wait.handles[1] ), flags, NULL, inline_apc ); +} diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index fc7ae671314..ea46ff3eb55 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -275,6 +275,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 NTSTATUS wait_async_after_apc( HANDLE optional_handle, BOOL alertable, NTSTATUS prev_status, const inline_apc_t *inline_apc ); extern void dbg_init(void) DECLSPEC_HIDDEN; -- 2.31.1