diff options
Diffstat (limited to 'lib/sqfs/block_processor/internal.h')
-rw-r--r-- | lib/sqfs/block_processor/internal.h | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/sqfs/block_processor/internal.h b/lib/sqfs/block_processor/internal.h new file mode 100644 index 0000000..40871b9 --- /dev/null +++ b/lib/sqfs/block_processor/internal.h @@ -0,0 +1,141 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * internal.h + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#ifndef INTERNAL_H +#define INTERNAL_H + +#include "config.h" + +#include "sqfs/block_processor.h" +#include "sqfs/frag_table.h" +#include "sqfs/compressor.h" +#include "sqfs/inode.h" +#include "sqfs/table.h" +#include "sqfs/error.h" +#include "sqfs/block.h" +#include "sqfs/io.h" +#include "../util.h" + +#include <string.h> +#include <stdlib.h> +#include <zlib.h> + +#ifdef WITH_PTHREAD +#include <pthread.h> +#include <signal.h> +#elif defined(_WIN32) || defined(__WINDOWS__) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + + +#define MK_BLK_HASH(chksum, size) \ + (((sqfs_u64)(size) << 32) | (sqfs_u64)(chksum)) + +#define INIT_BLOCK_COUNT (128) + + +typedef struct { + sqfs_u64 offset; + sqfs_u64 hash; +} blk_info_t; + + +typedef struct compress_worker_t compress_worker_t; + +struct sqfs_block_processor_t { + /* synchronization primitives */ +#ifdef WITH_PTHREAD + pthread_mutex_t mtx; + pthread_cond_t queue_cond; + pthread_cond_t done_cond; +#elif defined(_WIN32) || defined(__WINDOWS__) + CRITICAL_SECTION mtx; + CONDITION_VARIABLE queue_cond; + CONDITION_VARIABLE done_cond; +#endif + + /* needs rw access by worker and main thread */ + sqfs_block_t *queue; + sqfs_block_t *queue_last; + + sqfs_block_t *done; + size_t backlog; + int status; + + /* used by main thread only */ + sqfs_u32 enqueue_id; + sqfs_u32 dequeue_id; + + unsigned int num_workers; + size_t max_backlog; + + size_t devblksz; + sqfs_file_t *file; + + sqfs_frag_table_t *frag_tbl; + + sqfs_u64 start; + + size_t file_start; + size_t num_blocks; + size_t max_blocks; + blk_info_t *blocks; + sqfs_compressor_t *cmp; + + sqfs_block_t *frag_block; + + const sqfs_block_hooks_t *hooks; + void *user_ptr; + bool notify_threads; + + /* file API */ + sqfs_inode_generic_t *inode; + sqfs_block_t *blk_current; + sqfs_u32 blk_flags; + size_t blk_index; + + /* used only by workers */ + size_t max_block_size; + +#if defined(WITH_PTHREAD) || defined(_WIN32) || defined(__WINDOWS__) + compress_worker_t *workers[]; +#else + sqfs_u8 scratch[]; +#endif +}; + +SQFS_INTERNAL int process_completed_block(sqfs_block_processor_t *proc, + sqfs_block_t *block); + +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, size_t devblksz, + sqfs_file_t *file); + +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); + +SQFS_INTERNAL +int test_and_set_status(sqfs_block_processor_t *proc, int status); + +SQFS_INTERNAL +int append_to_work_queue(sqfs_block_processor_t *proc, sqfs_block_t *block, + bool notify_threads); + +SQFS_INTERNAL int wait_completed(sqfs_block_processor_t *proc); + +#endif /* INTERNAL_H */ |