diff options
Diffstat (limited to 'lib/sqfs/blk_proc/pthread.c')
-rw-r--r-- | lib/sqfs/blk_proc/pthread.c | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/lib/sqfs/blk_proc/pthread.c b/lib/sqfs/blk_proc/pthread.c index fb83bbe..ee73e52 100644 --- a/lib/sqfs/blk_proc/pthread.c +++ b/lib/sqfs/blk_proc/pthread.c @@ -200,7 +200,6 @@ void sqfs_block_processor_destroy(sqfs_block_processor_t *proc) int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, sqfs_block_t *block) { - sqfs_block_t *queue = NULL, *it, *prev; int status; pthread_mutex_lock(&proc->mtx); @@ -236,25 +235,30 @@ int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, proc->backlog += 1; } - it = proc->done; - prev = NULL; - - while (it != NULL && it->sequence_number == proc->dequeue_id) { - prev = it; - it = it->next; + if (proc->done != NULL && + proc->done->sequence_number == proc->dequeue_id) { + block = proc->done; + proc->done = proc->done->next; proc->dequeue_id += 1; - } - - if (prev != NULL) { - queue = proc->done; - prev->next = NULL; - proc->done = it; + } else { + block = NULL; } pthread_cond_broadcast(&proc->queue_cond); pthread_mutex_unlock(&proc->mtx); - return process_completed_blocks(proc, queue); + if (block == NULL) + return 0; + + status = process_completed_block(proc, block); + if (status != 0) { + pthread_mutex_lock(&proc->mtx); + proc->status = status; + goto fail; + } + + free(block); + return 0; fail: pthread_mutex_unlock(&proc->mtx); free(block); @@ -287,12 +291,19 @@ int sqfs_block_processor_finish(sqfs_block_processor_t *proc) proc->done = NULL; pthread_mutex_unlock(&proc->mtx); - status = process_completed_blocks(proc, queue); - if (status != 0) { - pthread_mutex_lock(&proc->mtx); - proc->status = status; - pthread_cond_broadcast(&proc->queue_cond); - goto fail; + while (queue != NULL) { + it = queue; + queue = queue->next; + it->next = NULL; + + status = process_completed_block(proc, it); + free(it); + if (status != 0) { + pthread_mutex_lock(&proc->mtx); + proc->status = status; + pthread_cond_broadcast(&proc->queue_cond); + goto fail; + } } return 0; |