diff options
Diffstat (limited to 'lib')
-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 | ||||
-rw-r--r-- | lib/sqfshelper/data_writer.c | 63 |
4 files changed, 86 insertions, 79 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; } } diff --git a/lib/sqfshelper/data_writer.c b/lib/sqfshelper/data_writer.c index 6a0ef17..c41088a 100644 --- a/lib/sqfshelper/data_writer.c +++ b/lib/sqfshelper/data_writer.c @@ -19,7 +19,7 @@ #include <zlib.h> struct data_writer_t { - block_t *frag_block; + sqfs_block_t *frag_block; sqfs_fragment_t *fragments; size_t num_fragments; size_t max_fragments; @@ -28,7 +28,7 @@ struct data_writer_t { uint64_t bytes_written; off_t start; - block_processor_t *proc; + sqfs_block_processor_t *proc; compressor_t *cmp; file_info_t *list; sqfs_super_t *super; @@ -36,10 +36,10 @@ struct data_writer_t { }; enum { - BLK_FIRST_BLOCK = BLK_USER, - BLK_LAST_BLOCK = BLK_USER << 1, - BLK_ALLIGN = BLK_USER << 2, - BLK_FRAGMENT_BLOCK = BLK_USER << 3, + BLK_FIRST_BLOCK = SQFS_BLK_USER, + BLK_LAST_BLOCK = SQFS_BLK_USER << 1, + BLK_ALLIGN = SQFS_BLK_USER << 2, + BLK_FRAGMENT_BLOCK = SQFS_BLK_USER << 3, }; static int save_position(data_writer_t *data) @@ -87,7 +87,7 @@ static int allign_file(data_writer_t *data) return 0; } -static int block_callback(void *user, block_t *blk) +static int block_callback(void *user, sqfs_block_t *blk) { file_info_t *fi = blk->user; data_writer_t *data = user; @@ -106,7 +106,7 @@ static int block_callback(void *user, block_t *blk) if (blk->size != 0) { out = blk->size; - if (!(blk->flags & BLK_IS_COMPRESSED)) + if (!(blk->flags & SQFS_BLK_IS_COMPRESSED)) out |= 1 << 24; if (blk->flags & BLK_FRAGMENT_BLOCK) { @@ -172,12 +172,12 @@ static int flush_fragment_block(data_writer_t *data) data->frag_block->index = data->num_fragments++; - ret = block_processor_enqueue(data->proc, data->frag_block); + ret = sqfs_block_processor_enqueue(data->proc, data->frag_block); data->frag_block = NULL; return ret; } -static int store_fragment(data_writer_t *data, block_t *frag) +static int store_fragment(data_writer_t *data, sqfs_block_t *frag) { file_info_t *fi = frag->user; size_t size; @@ -192,7 +192,7 @@ static int store_fragment(data_writer_t *data, block_t *frag) } if (data->frag_block == NULL) { - size = sizeof(block_t) + data->super->block_size; + size = sizeof(sqfs_block_t) + data->super->block_size; data->frag_block = calloc(1, size); if (data->frag_block == NULL) { @@ -200,14 +200,14 @@ static int store_fragment(data_writer_t *data, block_t *frag) goto fail; } - data->frag_block->flags = BLK_DONT_CHECKSUM; + data->frag_block->flags = SQFS_BLK_DONT_CHECKSUM; data->frag_block->flags |= BLK_FRAGMENT_BLOCK; } fi->fragment_offset = data->frag_block->size; fi->fragment = data->num_fragments; - data->frag_block->flags |= (frag->flags & BLK_DONT_COMPRESS); + data->frag_block->flags |= (frag->flags & SQFS_BLK_DONT_COMPRESS); memcpy(data->frag_block->data + data->frag_block->size, frag->data, frag->size); @@ -224,7 +224,7 @@ static bool is_zero_block(unsigned char *ptr, size_t size) return ptr[0] == 0 && memcmp(ptr, ptr + 1, size - 1) == 0; } -static int handle_fragment(data_writer_t *data, block_t *blk) +static int handle_fragment(data_writer_t *data, sqfs_block_t *blk) { file_info_t *fi = blk->user, *ref; @@ -247,7 +247,7 @@ static int handle_fragment(data_writer_t *data, block_t *blk) static int add_sentinel_block(data_writer_t *data, file_info_t *fi, uint32_t flags) { - block_t *blk = calloc(1, sizeof(*blk)); + sqfs_block_t *blk = calloc(1, sizeof(*blk)); if (blk == NULL) { perror("creating sentinel block"); @@ -255,15 +255,15 @@ static int add_sentinel_block(data_writer_t *data, file_info_t *fi, } blk->user = fi; - blk->flags = BLK_DONT_COMPRESS | BLK_DONT_CHECKSUM | flags; + blk->flags = SQFS_BLK_DONT_COMPRESS | SQFS_BLK_DONT_CHECKSUM | flags; - return block_processor_enqueue(data->proc, blk); + return sqfs_block_processor_enqueue(data->proc, blk); } -static block_t *create_block(file_info_t *fi, int fd, size_t size, - uint32_t flags) +static sqfs_block_t *create_block(file_info_t *fi, int fd, size_t size, + uint32_t flags) { - block_t *blk = alloc_flex(sizeof(*blk), 1, size); + sqfs_block_t *blk = alloc_flex(sizeof(*blk), 1, size); if (blk == NULL) { perror(fi->input_file); @@ -289,10 +289,10 @@ int write_data_from_fd(data_writer_t *data, file_info_t *fi, uint32_t blk_flags = BLK_FIRST_BLOCK; uint64_t file_size = fi->size; size_t diff, i = 0; - block_t *blk; + sqfs_block_t *blk; if (flags & DW_DONT_COMPRESS) - blk_flags |= BLK_DONT_COMPRESS; + blk_flags |= SQFS_BLK_DONT_COMPRESS; if (flags & DW_ALLIGN_DEVBLK) blk_flags |= BLK_ALLIGN; @@ -336,7 +336,7 @@ int write_data_from_fd(data_writer_t *data, file_info_t *fi, if (handle_fragment(data, blk)) return -1; } else { - if (block_processor_enqueue(data->proc, blk)) + if (sqfs_block_processor_enqueue(data->proc, blk)) return -1; blk_flags &= ~BLK_FIRST_BLOCK; @@ -383,7 +383,7 @@ fail_map: return -1; } -static int get_sparse_block(block_t *blk, file_info_t *fi, int infd, +static int get_sparse_block(sqfs_block_t *blk, file_info_t *fi, int infd, sparse_map_t **sparse_map, uint64_t offset, size_t diff) { @@ -418,14 +418,14 @@ int write_data_from_fd_condensed(data_writer_t *data, file_info_t *fi, { uint32_t blk_flags = BLK_FIRST_BLOCK; size_t diff, i = 0; + sqfs_block_t *blk; uint64_t offset; - block_t *blk; if (check_map_valid(map, fi)) return -1; if (flags & DW_DONT_COMPRESS) - blk_flags |= BLK_DONT_COMPRESS; + blk_flags |= SQFS_BLK_DONT_COMPRESS; if (flags & DW_ALLIGN_DEVBLK) blk_flags |= BLK_ALLIGN; @@ -471,7 +471,7 @@ int write_data_from_fd_condensed(data_writer_t *data, file_info_t *fi, if (handle_fragment(data, blk)) return -1; } else { - if (block_processor_enqueue(data->proc, blk)) + if (sqfs_block_processor_enqueue(data->proc, blk)) return -1; blk_flags &= ~BLK_FIRST_BLOCK; @@ -499,8 +499,9 @@ data_writer_t *data_writer_create(sqfs_super_t *super, compressor_t *cmp, return NULL; } - data->proc = block_processor_create(super->block_size, cmp, num_jobs, - data, block_callback); + data->proc = sqfs_block_processor_create(super->block_size, cmp, + num_jobs, data, + block_callback); data->cmp = cmp; data->super = super; data->outfd = outfd; @@ -510,7 +511,7 @@ data_writer_t *data_writer_create(sqfs_super_t *super, compressor_t *cmp, void data_writer_destroy(data_writer_t *data) { - block_processor_destroy(data->proc); + sqfs_block_processor_destroy(data->proc); free(data->fragments); free(data); } @@ -545,5 +546,5 @@ int data_writer_sync(data_writer_t *data) return -1; } - return block_processor_finish(data->proc); + return sqfs_block_processor_finish(data->proc); } |