From 9ac42164bc43bcdd47c0a8e5e59c662b2a136659 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Fri, 14 Feb 2020 17:56:40 +0100 Subject: Cleanup: block processor: move init/cleanup functions into implemenations Again, the generic init/cleanup functions do way too many things that are specific to the thread pool implementation. Thanks to the splitting up of the block processor, they also have become quite trivial. This commit moves those functions into their respective implementations, allowing even further simplificiation. Signed-off-by: David Oberhollenzer --- lib/sqfs/block_processor/common.c | 37 -------------------------- lib/sqfs/block_processor/internal.h | 10 ------- lib/sqfs/block_processor/serial.c | 40 ++++++++++++++-------------- lib/sqfs/block_processor/winpthread.c | 49 +++++++++++++++++++++++++---------- 4 files changed, 57 insertions(+), 79 deletions(-) diff --git a/lib/sqfs/block_processor/common.c b/lib/sqfs/block_processor/common.c index e2d92c5..c8dbbc2 100644 --- a/lib/sqfs/block_processor/common.c +++ b/lib/sqfs/block_processor/common.c @@ -7,43 +7,6 @@ #define SQFS_BUILDING_DLL #include "internal.h" -void free_blk_list(sqfs_block_t *list) -{ - sqfs_block_t *it; - - while (list != NULL) { - it = list; - list = list->next; - free(it); - } -} - -int block_processor_init(sqfs_block_processor_t *proc, size_t max_block_size, - sqfs_compressor_t *cmp, unsigned int num_workers, - size_t max_backlog, sqfs_block_writer_t *wr, - sqfs_frag_table_t *tbl) -{ - proc->max_block_size = max_block_size; - proc->num_workers = num_workers; - proc->max_backlog = max_backlog; - proc->cmp = cmp; - proc->frag_tbl = tbl; - proc->wr = wr; - - memset(&proc->stats, 0, sizeof(proc->stats)); - proc->stats.size = sizeof(proc->stats); - return 0; -} - -void block_processor_cleanup(sqfs_block_processor_t *proc) -{ - free_blk_list(proc->queue); - free_blk_list(proc->done); - free(proc->blk_current); - free(proc->frag_block); - free(proc); -} - int process_completed_block(sqfs_block_processor_t *proc, sqfs_block_t *blk) { sqfs_u64 location; diff --git a/lib/sqfs/block_processor/internal.h b/lib/sqfs/block_processor/internal.h index a764b2f..45db014 100644 --- a/lib/sqfs/block_processor/internal.h +++ b/lib/sqfs/block_processor/internal.h @@ -109,16 +109,6 @@ SQFS_INTERNAL int process_completed_fragment(sqfs_block_processor_t *proc, sqfs_block_t *frag, sqfs_block_t **blk_out); -SQFS_INTERNAL void free_blk_list(sqfs_block_t *list); - -SQFS_INTERNAL -int block_processor_init(sqfs_block_processor_t *proc, size_t max_block_size, - sqfs_compressor_t *cmp, unsigned int num_workers, - size_t max_backlog, sqfs_block_writer_t *wr, - sqfs_frag_table_t *tbl); - -SQFS_INTERNAL void block_processor_cleanup(sqfs_block_processor_t *proc); - SQFS_INTERNAL int block_processor_do_block(sqfs_block_t *block, sqfs_compressor_t *cmp, sqfs_u8 *scratch, size_t scratch_size); diff --git a/lib/sqfs/block_processor/serial.c b/lib/sqfs/block_processor/serial.c index b1e1823..c9ee164 100644 --- a/lib/sqfs/block_processor/serial.c +++ b/lib/sqfs/block_processor/serial.c @@ -9,7 +9,11 @@ static void block_processor_destroy(sqfs_object_t *obj) { - block_processor_cleanup((sqfs_block_processor_t *)obj); + sqfs_block_processor_t *proc = (sqfs_block_processor_t *)obj; + + free(proc->blk_current); + free(proc->frag_block); + free(proc); } sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, @@ -20,18 +24,17 @@ sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, sqfs_frag_table_t *tbl) { sqfs_block_processor_t *proc; + (void)num_workers; (void)max_backlog; proc = alloc_flex(sizeof(*proc), 1, max_block_size); - if (proc == NULL) return NULL; - if (block_processor_init(proc, max_block_size, cmp, num_workers, - max_backlog, wr, tbl)) { - block_processor_cleanup(proc); - return NULL; - } - + proc->max_block_size = max_block_size; + proc->cmp = cmp; + proc->frag_tbl = tbl; + proc->wr = wr; + proc->stats.size = sizeof(proc->stats); ((sqfs_object_t *)proc)->destroy = block_processor_destroy; return proc; } @@ -80,18 +83,17 @@ int wait_completed(sqfs_block_processor_t *proc) int sqfs_block_processor_finish(sqfs_block_processor_t *proc) { - if (proc->frag_block != NULL && proc->status == 0) { - proc->status = block_processor_do_block(proc->frag_block, - proc->cmp, - proc->scratch, - proc->max_block_size); - - if (proc->status == 0) { - proc->status = process_completed_block(proc, - proc->frag_block); - } - } + if (proc->frag_block == NULL || proc->status != 0) + goto out; + + proc->status = block_processor_do_block(proc->frag_block, proc->cmp, + proc->scratch, + proc->max_block_size); + if (proc->status != 0) + goto out; + proc->status = process_completed_block(proc, proc->frag_block); +out: free(proc->frag_block); proc->frag_block = NULL; return proc->status; diff --git a/lib/sqfs/block_processor/winpthread.c b/lib/sqfs/block_processor/winpthread.c index 708a2d1..fcbb8b4 100644 --- a/lib/sqfs/block_processor/winpthread.c +++ b/lib/sqfs/block_processor/winpthread.c @@ -34,6 +34,17 @@ struct compress_worker_t { sqfs_u8 scratch[]; }; +static void free_blk_list(sqfs_block_t *list) +{ + sqfs_block_t *it; + + while (list != NULL) { + it = list; + list = list->next; + free(it); + } +} + static THREAD_TYPE worker_proc(THREAD_ARG arg) { compress_worker_t *worker = arg; @@ -120,7 +131,11 @@ static void block_processor_destroy(sqfs_object_t *obj) } DeleteCriticalSection(&proc->mtx); - block_processor_cleanup(proc); + free_blk_list(proc->queue); + free_blk_list(proc->done); + free(proc->blk_current); + free(proc->frag_block); + free(proc); } sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, @@ -141,17 +156,19 @@ sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, if (proc == NULL) return NULL; + proc->max_block_size = max_block_size; + proc->num_workers = num_workers; + proc->max_backlog = max_backlog; + proc->cmp = cmp; + proc->frag_tbl = tbl; + proc->wr = wr; + proc->stats.size = sizeof(proc->stats); ((sqfs_object_t *)obj)->destroy = block_processor_destroy; InitializeCriticalSection(&proc->mtx); InitializeConditionVariable(&proc->queue_cond); InitializeConditionVariable(&proc->done_cond); - if (block_processor_init(proc, max_block_size, cmp, num_workers, - max_backlog, wr, tbl)) { - goto fail; - } - for (i = 0; i < num_workers; ++i) { proc->workers[i] = alloc_flex(sizeof(compress_worker_t), 1, max_block_size); @@ -198,7 +215,11 @@ static void block_processor_destroy(sqfs_object_t *obj) pthread_cond_destroy(&proc->queue_cond); pthread_mutex_destroy(&proc->mtx); - block_processor_cleanup(proc); + free_blk_list(proc->queue); + free_blk_list(proc->done); + free(proc->blk_current); + free(proc->frag_block); + free(proc); } sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, @@ -225,11 +246,13 @@ sqfs_block_processor_t *sqfs_block_processor_create(size_t max_block_size, proc->mtx = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER; proc->queue_cond = (pthread_cond_t)PTHREAD_COND_INITIALIZER; proc->done_cond = (pthread_cond_t)PTHREAD_COND_INITIALIZER; - - if (block_processor_init(proc, max_block_size, cmp, num_workers, - max_backlog, wr, tbl)) { - goto fail_init; - } + proc->max_block_size = max_block_size; + proc->num_workers = num_workers; + proc->max_backlog = max_backlog; + proc->cmp = cmp; + proc->frag_tbl = tbl; + proc->wr = wr; + proc->stats.size = sizeof(proc->stats); for (i = 0; i < num_workers; ++i) { proc->workers[i] = alloc_flex(sizeof(compress_worker_t), @@ -283,7 +306,7 @@ fail_init: pthread_cond_destroy(&proc->done_cond); pthread_cond_destroy(&proc->queue_cond); pthread_mutex_destroy(&proc->mtx); - block_processor_cleanup(proc); + free(proc); return NULL; } #endif -- cgit v1.2.3