Commit 5d2f2797 authored by Paul Gofman's avatar Paul Gofman Committed by Alexandre Julliard

winhttp: Keep task in queue until completion.

parent 5dee0ed7
...@@ -135,15 +135,16 @@ void stop_queue( struct queue *queue ) ...@@ -135,15 +135,16 @@ void stop_queue( struct queue *queue )
TRACE("stopped %p\n", 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; struct list *entry;
AcquireSRWLockExclusive( &queue->lock ); AcquireSRWLockExclusive( &queue->lock );
assert( queue->callback_running ); assert( queue->callback_running );
if ((entry = list_head( &queue->queued_tasks ))) if (prev_task)
list_remove( entry ); list_remove( &prev_task->entry );
else
if (!(entry = list_head( &queue->queued_tasks )))
queue->callback_running = FALSE; queue->callback_running = FALSE;
ReleaseSRWLockExclusive( &queue->lock ); ReleaseSRWLockExclusive( &queue->lock );
if (!entry) return NULL; if (!entry) return NULL;
...@@ -157,12 +158,12 @@ static void CALLBACK task_callback( TP_CALLBACK_INSTANCE *instance, void *ctx ) ...@@ -157,12 +158,12 @@ static void CALLBACK task_callback( TP_CALLBACK_INSTANCE *instance, void *ctx )
TRACE( "instance %p.\n", instance ); TRACE( "instance %p.\n", instance );
task = get_next_task( queue ); task = get_next_task( queue, NULL );
while (task) while (task)
{ {
task->callback( task ); task->callback( task );
/* Queue object may be freed by release_object() unless there is another task referencing it. */ /* 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 ); release_object( task->obj );
free( task ); free( task );
task = next_task; task = next_task;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment