diff options
Diffstat (limited to 'lib/sqfs')
-rw-r--r-- | lib/sqfs/block_processor.c | 29 | ||||
-rw-r--r-- | lib/sqfs/block_processor_parallel.c | 63 | ||||
-rw-r--r-- | lib/sqfs/process_block.c | 10 |
3 files changed, 54 insertions, 48 deletions
diff --git a/lib/sqfs/block_processor.c b/lib/sqfs/block_processor.c index 3a6926c..2bf307f 100644 --- a/lib/sqfs/block_processor.c +++ b/lib/sqfs/block_processor.c @@ -13,25 +13,27 @@ #include <stdlib.h> #include <stdio.h> -struct block_processor_t { +struct sqfs_block_processor_t { size_t max_block_size; compressor_t *cmp; - block_cb cb; + sqfs_block_cb cb; void *user; int status; uint8_t scratch[]; }; -block_processor_t *block_processor_create(size_t max_block_size, - compressor_t *cmp, - unsigned int num_workers, - void *user, - block_cb callback) +sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, + compressor_t *cmp, + unsigned int num_workers, + void *user, + sqfs_block_cb callback) { - block_processor_t *proc = alloc_flex(sizeof(*proc), 1, max_block_size); + sqfs_block_processor_t *proc; (void)num_workers; + proc = alloc_flex(sizeof(*proc), 1, max_block_size); + if (proc == NULL) { perror("Creating block processor"); return NULL; @@ -44,15 +46,16 @@ block_processor_t *block_processor_create(size_t max_block_size, return proc; } -void block_processor_destroy(block_processor_t *proc) +void sqfs_block_processor_destroy(sqfs_block_processor_t *proc) { free(proc); } -int block_processor_enqueue(block_processor_t *proc, block_t *block) +int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, + sqfs_block_t *block) { - if (process_block(block, proc->cmp, - proc->scratch, proc->max_block_size)) + if (sqfs_block_process(block, proc->cmp, + proc->scratch, proc->max_block_size)) goto fail; if (proc->cb(proc->user, block)) @@ -66,7 +69,7 @@ fail: return -1; } -int block_processor_finish(block_processor_t *proc) +int sqfs_block_processor_finish(sqfs_block_processor_t *proc) { return proc->status; } diff --git a/lib/sqfs/block_processor_parallel.c b/lib/sqfs/block_processor_parallel.c index a4e0f6e..6fca018 100644 --- a/lib/sqfs/block_processor_parallel.c +++ b/lib/sqfs/block_processor_parallel.c @@ -17,22 +17,22 @@ #define MAX_BACKLOG_FACTOR (10) typedef struct { - block_processor_t *shared; + sqfs_block_processor_t *shared; compressor_t *cmp; pthread_t thread; uint8_t scratch[]; } compress_worker_t; -struct block_processor_t { +struct sqfs_block_processor_t { pthread_mutex_t mtx; pthread_cond_t queue_cond; pthread_cond_t done_cond; /* needs rw access by worker and main thread */ - block_t *queue; - block_t *queue_last; + sqfs_block_t *queue; + sqfs_block_t *queue_last; - block_t *done; + sqfs_block_t *done; bool terminate; size_t backlog; @@ -41,7 +41,7 @@ struct block_processor_t { uint32_t dequeue_id; unsigned int num_workers; - block_cb cb; + sqfs_block_cb cb; void *user; int status; @@ -51,9 +51,10 @@ struct block_processor_t { compress_worker_t *workers[]; }; -static void store_completed_block(block_processor_t *shared, block_t *blk) +static void store_completed_block(sqfs_block_processor_t *shared, + sqfs_block_t *blk) { - block_t *it = shared->done, *prev = NULL; + sqfs_block_t *it = shared->done, *prev = NULL; while (it != NULL) { if (it->sequence_number >= blk->sequence_number) @@ -74,8 +75,8 @@ static void store_completed_block(block_processor_t *shared, block_t *blk) static void *worker_proc(void *arg) { compress_worker_t *worker = arg; - block_processor_t *shared = worker->shared; - block_t *blk = NULL; + sqfs_block_processor_t *shared = worker->shared; + sqfs_block_t *blk = NULL; for (;;) { pthread_mutex_lock(&shared->mtx); @@ -103,21 +104,21 @@ static void *worker_proc(void *arg) shared->queue_last = NULL; pthread_mutex_unlock(&shared->mtx); - if (process_block(blk, worker->cmp, worker->scratch, - shared->max_block_size)) { - blk->flags |= BLK_COMPRESS_ERROR; + if (sqfs_block_process(blk, worker->cmp, worker->scratch, + shared->max_block_size)) { + blk->flags |= SQFS_BLK_COMPRESS_ERROR; } } return NULL; } -block_processor_t *block_processor_create(size_t max_block_size, - compressor_t *cmp, - unsigned int num_workers, - void *user, - block_cb callback) +sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, + compressor_t *cmp, + unsigned int num_workers, + void *user, + sqfs_block_cb callback) { - block_processor_t *proc; + sqfs_block_processor_t *proc; unsigned int i; int ret; @@ -210,10 +211,10 @@ fail_free: return NULL; } -void block_processor_destroy(block_processor_t *proc) +void sqfs_block_processor_destroy(sqfs_block_processor_t *proc) { + sqfs_block_t *blk; unsigned int i; - block_t *blk; pthread_mutex_lock(&proc->mtx); proc->terminate = true; @@ -246,15 +247,16 @@ void block_processor_destroy(block_processor_t *proc) free(proc); } -static int process_completed_blocks(block_processor_t *proc, block_t *queue) +static int process_completed_blocks(sqfs_block_processor_t *proc, + sqfs_block_t *queue) { - block_t *it; + sqfs_block_t *it; while (queue != NULL) { it = queue; queue = queue->next; - if (it->flags & BLK_COMPRESS_ERROR) { + if (it->flags & SQFS_BLK_COMPRESS_ERROR) { proc->status = -1; } else { if (proc->cb(proc->user, it)) @@ -267,16 +269,17 @@ static int process_completed_blocks(block_processor_t *proc, block_t *queue) return proc->status; } -int block_processor_enqueue(block_processor_t *proc, block_t *block) +int sqfs_block_processor_enqueue(sqfs_block_processor_t *proc, + sqfs_block_t *block) { - block_t *queue = NULL, *it, *prev; + sqfs_block_t *queue = NULL, *it, *prev; block->sequence_number = proc->enqueue_id++; block->next = NULL; pthread_mutex_lock(&proc->mtx); - if ((block->flags & BLK_DONT_COMPRESS) && - (block->flags & BLK_DONT_CHECKSUM)) { + if ((block->flags & SQFS_BLK_DONT_COMPRESS) && + (block->flags & SQFS_BLK_DONT_CHECKSUM)) { store_completed_block(proc, block); } else { while (proc->backlog > proc->num_workers * MAX_BACKLOG_FACTOR) @@ -313,9 +316,9 @@ int block_processor_enqueue(block_processor_t *proc, block_t *block) return process_completed_blocks(proc, queue); } -int block_processor_finish(block_processor_t *proc) +int sqfs_block_processor_finish(sqfs_block_processor_t *proc) { - block_t *queue, *it; + sqfs_block_t *queue, *it; pthread_mutex_lock(&proc->mtx); while (proc->backlog > 0) diff --git a/lib/sqfs/process_block.c b/lib/sqfs/process_block.c index a20b56b..b0c8a91 100644 --- a/lib/sqfs/process_block.c +++ b/lib/sqfs/process_block.c @@ -12,15 +12,15 @@ #include <string.h> #include <zlib.h> -int process_block(block_t *block, compressor_t *cmp, - uint8_t *scratch, size_t scratch_size) +int sqfs_block_process(sqfs_block_t *block, compressor_t *cmp, + uint8_t *scratch, size_t scratch_size) { ssize_t ret; - if (!(block->flags & BLK_DONT_CHECKSUM)) + if (!(block->flags & SQFS_BLK_DONT_CHECKSUM)) block->checksum = crc32(0, block->data, block->size); - if (!(block->flags & BLK_DONT_COMPRESS)) { + if (!(block->flags & SQFS_BLK_DONT_COMPRESS)) { ret = cmp->do_block(cmp, block->data, block->size, scratch, scratch_size); @@ -30,7 +30,7 @@ int process_block(block_t *block, compressor_t *cmp, if (ret > 0) { memcpy(block->data, scratch, ret); block->size = ret; - block->flags |= BLK_IS_COMPRESSED; + block->flags |= SQFS_BLK_IS_COMPRESSED; } } |