summaryrefslogtreecommitdiff
path: root/lib/sqfs/block_processor/internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqfs/block_processor/internal.h')
-rw-r--r--lib/sqfs/block_processor/internal.h141
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 */