summaryrefslogtreecommitdiff
path: root/lib/sqfs/block_processor/winpthread.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqfs/block_processor/winpthread.c')
-rw-r--r--lib/sqfs/block_processor/winpthread.c168
1 files changed, 68 insertions, 100 deletions
diff --git a/lib/sqfs/block_processor/winpthread.c b/lib/sqfs/block_processor/winpthread.c
index e39f795..1519257 100644
--- a/lib/sqfs/block_processor/winpthread.c
+++ b/lib/sqfs/block_processor/winpthread.c
@@ -10,39 +10,65 @@
#if defined(_WIN32) || defined(__WINDOWS__)
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
-# define LOCK(mtx) EnterCriticalSection(mtx)
-# define UNLOCK(mtx) LeaveCriticalSection(mtx)
+# define LOCK EnterCriticalSection
+# define UNLOCK LeaveCriticalSection
# define AWAIT(cond, mtx) SleepConditionVariableCS(cond, mtx, INFINITE)
-# define SIGNAL_ALL(cond) WakeAllConditionVariable(cond)
+# define SIGNAL_ALL WakeAllConditionVariable
+# define THREAD_CREATE(hndptr, proc, arg) \
+ ((*hndptr) = CreateThread(NULL, 0, proc, arg, 0, 0), \
+ ((*hndptr) == NULL) ? -1 : 0)
# define THREAD_JOIN(t) \
- if (t != NULL) { \
+ do { \
WaitForSingleObject(t, INFINITE); \
CloseHandle(t); \
- }
-# define MUTEX_DESTROY(mtx) DeleteCriticalSection(mtx)
+ } while (0)
+# define MUTEX_INIT InitializeCriticalSection
+# define MUTEX_DESTROY DeleteCriticalSection
+# define CONDITION_INIT InitializeConditionVariable
# define CONDITION_DESTROY(cond)
# define THREAD_EXIT_SUCCESS 0
+# define THREAD_INVALID NULL
# define THREAD_TYPE DWORD WINAPI
-# define THREAD_ARG LPVOID
-# define THREAD_HANDLE HANDLE
-# define MUTEX_TYPE CRITICAL_SECTION
-# define CONDITION_TYPE CONDITION_VARIABLE
+# define SIGNAL_DISABLE(oldset) (void)oldset
+# define SIGNAL_ENABLE(oldset) (void)oldset
+
+typedef int sigset_t;
+typedef LPVOID THREAD_ARG;
+typedef HANDLE THREAD_HANDLE;
+typedef CRITICAL_SECTION MUTEX_TYPE;
+typedef CONDITION_VARIABLE CONDITION_TYPE;
#else
# include <pthread.h>
# include <signal.h>
-# define LOCK(mtx) pthread_mutex_lock(mtx)
-# define UNLOCK(mtx) pthread_mutex_unlock(mtx)
-# define AWAIT(cond, mtx) pthread_cond_wait(cond, mtx)
-# define SIGNAL_ALL(cond) pthread_cond_broadcast(cond)
-# define THREAD_JOIN(t) if (t != (pthread_t)0) { pthread_join(t, NULL); }
-# define MUTEX_DESTROY(mtx) pthread_mutex_destroy(mtx)
-# define CONDITION_DESTROY(cond) pthread_cond_destroy(cond)
+# define LOCK pthread_mutex_lock
+# define UNLOCK pthread_mutex_unlock
+# define AWAIT pthread_cond_wait
+# define SIGNAL_ALL pthread_cond_broadcast
+# define THREAD_CREATE(hndptr, proc, arg) \
+ pthread_create((hndptr), NULL, (proc), (arg))
+# define THREAD_JOIN(t) pthread_join((t), NULL)
+# define MUTEX_INIT(mtx) \
+ *(mtx) = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER
+# define MUTEX_DESTROY pthread_mutex_destroy
+# define CONDITION_INIT(cond) \
+ *(cond) = (pthread_cond_t)PTHREAD_COND_INITIALIZER
+# define CONDITION_DESTROY pthread_cond_destroy
# define THREAD_EXIT_SUCCESS NULL
-# define THREAD_TYPE void *
-# define THREAD_ARG void *
-# define THREAD_HANDLE pthread_t
-# define MUTEX_TYPE pthread_mutex_t
-# define CONDITION_TYPE pthread_cond_t
+# define THREAD_INVALID (pthread_t)0
+# define SIGNAL_ENABLE(oldset) pthread_sigmask(SIG_SETMASK, oldset, NULL)
+
+typedef void *THREAD_TYPE;
+typedef void *THREAD_ARG;
+typedef pthread_t THREAD_HANDLE;
+typedef pthread_mutex_t MUTEX_TYPE;
+typedef pthread_cond_t CONDITION_TYPE;
+
+static inline void SIGNAL_DISABLE(sigset_t *oldset)
+{
+ sigset_t set;
+ sigfillset(&set);
+ pthread_sigmask(SIG_SETMASK, &set, oldset);
+}
#endif
typedef struct compress_worker_t compress_worker_t;
@@ -176,7 +202,8 @@ static void block_processor_destroy(sqfs_object_t *obj)
for (i = 0; i < proc->num_workers; ++i) {
if (proc->workers[i] != NULL) {
- THREAD_JOIN(proc->workers[i]->thread);
+ if (proc->workers[i]->thread != THREAD_INVALID)
+ THREAD_JOIN(proc->workers[i]->thread);
if (proc->workers[i]->cmp != NULL)
sqfs_destroy(proc->workers[i]->cmp);
@@ -368,15 +395,17 @@ static int block_processor_sync(sqfs_block_processor_t *proc)
return append_to_work_queue(proc, NULL);
}
-static thread_pool_processor_t *block_processor_create(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_block_processor_t *sqfs_block_processor_create(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)
{
thread_pool_processor_t *proc;
+ sigset_t oldset;
unsigned int i;
+ int ret;
if (num_workers < 1)
num_workers = 1;
@@ -397,6 +426,12 @@ static thread_pool_processor_t *block_processor_create(size_t max_block_size,
proc->max_backlog = max_backlog;
((sqfs_object_t *)proc)->destroy = block_processor_destroy;
+ MUTEX_INIT(&proc->mtx);
+ CONDITION_INIT(&proc->queue_cond);
+ CONDITION_INIT(&proc->done_cond);
+
+ SIGNAL_DISABLE(&oldset);
+
for (i = 0; i < num_workers; ++i) {
proc->workers[i] = alloc_flex(sizeof(compress_worker_t),
1, max_block_size);
@@ -409,84 +444,17 @@ static thread_pool_processor_t *block_processor_create(size_t max_block_size,
if (proc->workers[i]->cmp == NULL)
goto fail;
- }
-
- return proc;
-fail:
- block_processor_destroy((sqfs_object_t *)proc);
- return NULL;
-}
-
-#if defined(_WIN32) || defined(__WINDOWS__)
-sqfs_block_processor_t *sqfs_block_processor_create(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)
-{
- thread_pool_processor_t *proc;
- unsigned int i;
-
- proc = block_processor_create(max_block_size, cmp, num_workers,
- max_backlog, wr, tbl);
- if (proc == NULL)
- return NULL;
-
- InitializeCriticalSection(&proc->mtx);
- InitializeConditionVariable(&proc->queue_cond);
- InitializeConditionVariable(&proc->done_cond);
-
- for (i = 0; i < num_workers; ++i) {
- proc->workers[i]->thread = CreateThread(NULL, 0, worker_proc,
- proc->workers[i], 0, 0);
- if (proc->workers[i]->thread == NULL)
- goto fail;
- }
-
- return (sqfs_block_processor_t *)proc;
-fail:
- block_processor_destroy((sqfs_object_t *)proc);
- return NULL;
-}
-#else
-sqfs_block_processor_t *sqfs_block_processor_create(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)
-{
- thread_pool_processor_t *proc;
- sigset_t set, oldset;
- unsigned int i;
- int ret;
-
- proc = block_processor_create(max_block_size, cmp, num_workers,
- max_backlog, wr, tbl);
- if (proc == NULL)
- return NULL;
-
- 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;
-
- sigfillset(&set);
- pthread_sigmask(SIG_SETMASK, &set, &oldset);
-
- for (i = 0; i < num_workers; ++i) {
- ret = pthread_create(&proc->workers[i]->thread, NULL,
- worker_proc, proc->workers[i]);
+ ret = THREAD_CREATE(&proc->workers[i]->thread,
+ worker_proc, proc->workers[i]);
if (ret != 0)
goto fail;
}
- pthread_sigmask(SIG_SETMASK, &oldset, NULL);
+ SIGNAL_ENABLE(&oldset);
return (sqfs_block_processor_t *)proc;
fail:
- pthread_sigmask(SIG_SETMASK, &oldset, NULL);
+ SIGNAL_ENABLE(&oldset);
block_processor_destroy((sqfs_object_t *)proc);
return NULL;
}
-#endif