[PATCH 1/7] winhttp: Keep task in queue until completion.
Paul Gofman
wine at gitlab.winehq.org
Mon Jun 6 23:02:29 CDT 2022
From: Paul Gofman <pgofman at codeweavers.com>
---
dlls/winhttp/request.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index fe703c19109..9abe4f45598 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -135,15 +135,16 @@ void stop_queue( struct queue *queue )
TRACE("stopped %p\n", queue);
}
-static struct task_header *get_next_task( struct queue *queue )
+static struct task_header *get_next_task( struct queue *queue, struct task_header *prev_task )
{
struct list *entry;
AcquireSRWLockExclusive( &queue->lock );
assert( queue->callback_running );
- if ((entry = list_head( &queue->queued_tasks )))
- list_remove( entry );
- else
+ if (prev_task)
+ list_remove( &prev_task->entry );
+
+ if (!(entry = list_head( &queue->queued_tasks )))
queue->callback_running = FALSE;
ReleaseSRWLockExclusive( &queue->lock );
if (!entry) return NULL;
@@ -157,12 +158,12 @@ static void CALLBACK task_callback( TP_CALLBACK_INSTANCE *instance, void *ctx )
TRACE( "instance %p.\n", instance );
- task = get_next_task( queue );
+ task = get_next_task( queue, NULL );
while (task)
{
task->callback( task );
/* Queue object may be freed by release_object() unless there is another task referencing it. */
- next_task = get_next_task( queue );
+ next_task = get_next_task( queue, task );
release_object( task->obj );
free( task );
task = next_task;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/195
More information about the wine-devel
mailing list