[PATCH 7/7] server: Pass existing async object to fd_queue_async.

Alexandre Julliard julliard at winehq.org
Tue Feb 21 16:31:33 CST 2017


Jacek Caban <jacek at codeweavers.com> writes:

> @@ -2030,23 +2030,22 @@ void default_poll_event( struct fd *fd, int event )
>      else if (!fd->inode) set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
>  }
>  
> -struct async *fd_queue_async( struct fd *fd, const async_data_t *data, struct iosb *iosb, int type )
> +void fd_queue_async( struct fd *fd, struct async *async, int type )
>  {
>      struct async_queue *queue;
> -    struct async *async;
>  
>      switch (type)
>      {
>      case ASYNC_TYPE_READ:
> -        if (!fd->read_q && !(fd->read_q = create_async_queue( fd ))) return NULL;
> +        if (!fd->read_q && !(fd->read_q = create_async_queue( fd ))) return;
>          queue = fd->read_q;
>          break;
>      case ASYNC_TYPE_WRITE:
> -        if (!fd->write_q && !(fd->write_q = create_async_queue( fd ))) return NULL;
> +        if (!fd->write_q && !(fd->write_q = create_async_queue( fd ))) return;
>          queue = fd->write_q;
>          break;
>      case ASYNC_TYPE_WAIT:
> -        if (!fd->wait_q && !(fd->wait_q = create_async_queue( fd ))) return NULL;
> +        if (!fd->wait_q && !(fd->wait_q = create_async_queue( fd ))) return;
>          queue = fd->wait_q;
>          break;
>      default:
> @@ -2054,18 +2053,15 @@ struct async *fd_queue_async( struct fd *fd, const async_data_t *data, struct io
>          assert(0);
>      }
>  
> -    if ((async = create_async( current, data, iosb )))
> +    queue_async( queue, async );
> +
> +    if (type != ASYNC_TYPE_WAIT)
>      {
> -        queue_async( queue, async );
> -        if (type != ASYNC_TYPE_WAIT)
> -        {
> -            if (!fd->inode)
> -                set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
> -            else  /* regular files are always ready for read and write */
> -                async_wake_up( queue, STATUS_ALERTED );
> -        }
> +        if (!fd->inode)
> +            set_fd_events( fd, fd->fd_ops->get_poll_events( fd ) );
> +        else  /* regular files are always ready for read and write */
> +            async_wake_up( queue, STATUS_ALERTED );
>      }
> -    return async;
>  }
>  
>  void fd_async_wake_up( struct fd *fd, int type, unsigned int status )
> @@ -2098,11 +2094,8 @@ void no_fd_queue_async( struct fd *fd, struct async *async, int type, int count
>  
>  void default_fd_queue_async( struct fd *fd, struct async *async, int type, int count )
>  {
> -    if ((async = fd_queue_async( fd, async_get_data( async ), NULL, type )))
> -    {
> -        release_object( async );
> -        set_error( STATUS_PENDING );
> -    }
> +    fd_queue_async( fd, async, type );
> +    if (!get_error()) set_error( STATUS_PENDING );

I think it would be better to still have fd_queue_async() return a
success flag instead of relying on the error code.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list