[RFC PATCH 05/11] server: Add helpers for synchronous APC delivery via ordinary server call reply.

Jinoh Kang jinoh.kang.kr at gmail.com
Sat Jan 22 08:00:33 CST 2022


On 1/22/22 22:00, Jinoh Kang wrote:

> diff --git a/server/request.h b/server/request.h
> index 3c455799d54..dd11a919361 100644
> --- a/server/request.h
> +++ b/server/request.h
> @@ -688,6 +688,7 @@ C_ASSERT( sizeof(data_size_t) == 4 );
>  C_ASSERT( sizeof(file_pos_t) == 8 );
>  C_ASSERT( sizeof(generic_map_t) == 16 );
>  C_ASSERT( sizeof(hw_input_t) == 40 );
> +C_ASSERT( sizeof(inline_apc_t) == 56 );

This file is auto-generated; it shouldn't be modified.

>  C_ASSERT( sizeof(int) == 4 );
>  C_ASSERT( sizeof(ioctl_code_t) == 4 );
>  C_ASSERT( sizeof(irp_params_t) == 32 );
> diff --git a/server/thread.c b/server/thread.c
> index 467ccd1f0db..5d6cc8f433d 100644
> --- a/server/thread.c
> +++ b/server/thread.c
> @@ -1211,6 +1211,49 @@ static void clear_apc_queue( struct list *queue )
>      }
>  }
>  
> +void try_suspend_apc_interrupt(void)
> +{
> +    static const select_op_t select_op_none = { SELECT_NONE };
> +    unsigned int error = get_error();
> +    select_on( &select_op_none, sizeof(select_op_none), 0,
> +               SELECT_INTERRUPTIBLE, TIMEOUT_INFINITE );
> +    set_error( error );
> +}
> +
> +static void enable_next_apc_interrupt(void)
> +{
> +    if (current->wait && !current->wait->cookie) end_wait( current, STATUS_TIMEOUT );
> +}
> +
> +void resume_apc_interrupt(void)
> +{
> +    enable_next_apc_interrupt();
> +    if (!list_empty( &current->system_apc ))
> +        wake_thread( current );
> +}
> +
> +int dequeue_synchronous_system_apc( inline_apc_t *inline_apc )
> +{
> +    struct thread_apc *apc;
> +    obj_handle_t handle;
> +    int result = 0;
> +    unsigned int error = get_error();
> +
> +    if ((apc = thread_dequeue_apc( current, 1 )))
> +    {
> +        if ((handle = alloc_handle_no_access_check( current->process, &apc->obj, SYNCHRONIZE, 0 )))
> +        {
> +            memset( inline_apc, 0, sizeof(*inline_apc) );
> +            inline_apc->call = apc->call;
> +            inline_apc->apc_handle = handle;
> +            result = 1;
> +        }
> +        release_object( apc );

Handle allocation failure is left unhandled.

-- 
Sincerely,
Jinoh Kang



More information about the wine-devel mailing list