diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-03-24 13:59:12 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2021-03-24 14:05:18 +0100 |
commit | 14d0d4d55ed579c471ec24c03cb3808d4d721a79 (patch) | |
tree | 2857fa7b8c00b2fe72919b34ed04256ad4ffb737 | |
parent | bee01b78fa0199a6568cc88b0cfdb5611504c3e0 (diff) |
Fix block processor queue accounting
Dequeuing won't work if we have a backlog of 1 or 2 and the blocks
are used for internal buffering. Take that into account, similar to
the sync code. Also bump the minimum backlog to 3, just to make
absolutely sure we cannot run into a dequeue loop trying to allocate
a block.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | lib/sqfs/block_processor/backend.c | 10 | ||||
-rw-r--r-- | lib/sqfs/block_processor/block_processor.c | 4 |
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/sqfs/block_processor/backend.c b/lib/sqfs/block_processor/backend.c index f81304b..35e5b4c 100644 --- a/lib/sqfs/block_processor/backend.c +++ b/lib/sqfs/block_processor/backend.c @@ -298,6 +298,16 @@ int dequeue_block(sqfs_block_processor_t *proc) if (proc->backlog < backlog_old) break; + if ((proc->backlog == 1) && + (proc->frag_block != NULL || proc->blk_current != NULL)) { + break; + } + + if ((proc->backlog == 2) && + proc->frag_block != NULL && proc->blk_current != NULL) { + break; + } + blk = proc->pool->dequeue(proc->pool); if (blk == NULL) { diff --git a/lib/sqfs/block_processor/block_processor.c b/lib/sqfs/block_processor/block_processor.c index 8303dce..de177cd 100644 --- a/lib/sqfs/block_processor/block_processor.c +++ b/lib/sqfs/block_processor/block_processor.c @@ -278,8 +278,8 @@ int sqfs_block_processor_create_ex(const sqfs_block_processor_desc_t *desc, ((sqfs_object_t *)proc)->destroy = block_processor_destroy; /* we need at least one current data block + one fragment block */ - if (proc->max_backlog < 2) - proc->max_backlog = 2; + if (proc->max_backlog < 3) + proc->max_backlog = 3; /* create the thread pool */ proc->pool = thread_pool_create(desc->num_workers, process_block); |