[PATCH 6/7] server: Use async_request_complete() in message_queue_read().
Zebediah Figura
zfigura at codeweavers.com
Wed Sep 1 17:28:40 CDT 2021
From: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
server/named_pipe.c | 38 ++++++++++++++++++++------------------
1 file changed, 20 insertions(+), 18 deletions(-)
diff --git a/server/named_pipe.c b/server/named_pipe.c
index da3485dd2bc..20407badc4c 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -763,16 +763,20 @@ static int pipe_end_get_volume_info( struct fd *fd, struct async *async, unsigne
return 0;
}
-static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
+static void message_queue_read( struct pipe_end *pipe_end, struct async *async )
{
+ struct iosb *iosb = async_get_iosb( async );
+ unsigned int status = STATUS_SUCCESS;
struct pipe_message *message;
+ data_size_t out_size;
if (pipe_end->flags & NAMED_PIPE_MESSAGE_STREAM_READ)
{
message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
- iosb->out_size = min( iosb->out_size, message->iosb->in_size - message->read_pos );
- iosb->status = message->read_pos + iosb->out_size < message->iosb->in_size
- ? STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
+ out_size = min( iosb->out_size, message->iosb->in_size - message->read_pos );
+
+ if (message->read_pos + out_size < message->iosb->in_size)
+ status = STATUS_BUFFER_OVERFLOW;
}
else
{
@@ -782,14 +786,13 @@ static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
avail += message->iosb->in_size - message->read_pos;
if (avail >= iosb->out_size) break;
}
- iosb->out_size = min( iosb->out_size, avail );
- iosb->status = STATUS_SUCCESS;
+ out_size = min( iosb->out_size, avail );
}
message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
if (!message->read_pos && message->iosb->in_size == iosb->out_size) /* fast path */
{
- iosb->out_data = message->iosb->in_data;
+ async_request_complete( async, status, out_size, out_size, message->iosb->in_data );
message->iosb->in_data = NULL;
wake_message( message, message->iosb->in_size );
free_message( message );
@@ -799,17 +802,17 @@ static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
data_size_t write_pos = 0, writing;
char *buf = NULL;
- if (iosb->out_size && !(buf = iosb->out_data = malloc( iosb->out_size )))
+ if (out_size && !(buf = malloc( out_size )))
{
- iosb->out_size = 0;
- iosb->status = STATUS_NO_MEMORY;
+ async_terminate( async, STATUS_NO_MEMORY );
+ release_object( iosb );
return;
}
do
{
message = LIST_ENTRY( list_head(&pipe_end->message_queue), struct pipe_message, entry );
- writing = min( iosb->out_size - write_pos, message->iosb->in_size - message->read_pos );
+ writing = min( out_size - write_pos, message->iosb->in_size - message->read_pos );
if (writing) memcpy( buf + write_pos, (const char *)message->iosb->in_data + message->read_pos, writing );
write_pos += writing;
message->read_pos += writing;
@@ -818,9 +821,12 @@ static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
wake_message(message, message->iosb->in_size);
free_message(message);
}
- } while (write_pos < iosb->out_size);
+ } while (write_pos < out_size);
+
+ async_request_complete( async, status, out_size, out_size, buf );
}
- iosb->result = iosb->out_size;
+
+ release_object( iosb );
}
/* We call async_terminate in our reselect implementation, which causes recursive reselect.
@@ -832,16 +838,12 @@ static void reselect_write_queue( struct pipe_end *pipe_end );
static void reselect_read_queue( struct pipe_end *pipe_end, int reselect_write )
{
struct async *async;
- struct iosb *iosb;
ignore_reselect = 1;
while (!list_empty( &pipe_end->message_queue ) && (async = find_pending_async( &pipe_end->read_q )))
{
- iosb = async_get_iosb( async );
- message_queue_read( pipe_end, iosb );
- async_terminate( async, iosb->result ? STATUS_ALERTED : iosb->status );
+ message_queue_read( pipe_end, async );
release_object( async );
- release_object( iosb );
reselect_write = 1;
}
ignore_reselect = 0;
--
2.33.0
More information about the wine-devel
mailing list