1 /** 2 * Copyright (c) 2016 Tino Reichardt 3 * All rights reserved. 4 * 5 * You can contact the author at: 6 * - zstdmt source repository: https://github.com/mcmilk/zstdmt 7 * 8 * This source code is licensed under both the BSD-style license (found in the 9 * LICENSE file in the root directory of this source tree) and the GPLv2 (found 10 * in the COPYING file in the root directory of this source tree). 11 * You may select, at your option, one of the above-listed licenses. 12 */ 13 14 #ifndef THREADING_H_938743 15 #define THREADING_H_938743 16 17 #include "debug.h" 18 19 #if defined (__cplusplus) 20 extern "C" { 21 #endif 22 23 #if defined(ZSTD_MULTITHREAD) && defined(_WIN32) 24 25 /** 26 * Windows minimalist Pthread Wrapper 27 */ 28 #ifdef WINVER 29 # undef WINVER 30 #endif 31 #define WINVER 0x0600 32 33 #ifdef _WIN32_WINNT 34 # undef _WIN32_WINNT 35 #endif 36 #define _WIN32_WINNT 0x0600 37 38 #ifndef WIN32_LEAN_AND_MEAN 39 # define WIN32_LEAN_AND_MEAN 40 #endif 41 42 #undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */ 43 #include <windows.h> 44 #undef ERROR 45 #define ERROR(name) ZSTD_ERROR(name) 46 47 48 /* mutex */ 49 #define ZSTD_pthread_mutex_t CRITICAL_SECTION 50 #define ZSTD_pthread_mutex_init(a, b) ((void)(b), InitializeCriticalSection((a)), 0) 51 #define ZSTD_pthread_mutex_destroy(a) DeleteCriticalSection((a)) 52 #define ZSTD_pthread_mutex_lock(a) EnterCriticalSection((a)) 53 #define ZSTD_pthread_mutex_unlock(a) LeaveCriticalSection((a)) 54 55 /* condition variable */ 56 #define ZSTD_pthread_cond_t CONDITION_VARIABLE 57 #define ZSTD_pthread_cond_init(a, b) ((void)(b), InitializeConditionVariable((a)), 0) 58 #define ZSTD_pthread_cond_destroy(a) ((void)(a)) 59 #define ZSTD_pthread_cond_wait(a, b) SleepConditionVariableCS((a), (b), INFINITE) 60 #define ZSTD_pthread_cond_signal(a) WakeConditionVariable((a)) 61 #define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a)) 62 63 /* ZSTD_pthread_create() and ZSTD_pthread_join() */ 64 typedef HANDLE ZSTD_pthread_t; 65 66 int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, 67 void* (*start_routine) (void*), void* arg); 68 69 int ZSTD_pthread_join(ZSTD_pthread_t thread); 70 71 /** 72 * add here more wrappers as required 73 */ 74 75 76 #elif defined(ZSTD_MULTITHREAD) /* posix assumed ; need a better detection method */ 77 /* === POSIX Systems === */ 78 # include <pthread.h> 79 80 #if DEBUGLEVEL < 1 81 82 #define ZSTD_pthread_mutex_t pthread_mutex_t 83 #define ZSTD_pthread_mutex_init(a, b) pthread_mutex_init((a), (b)) 84 #define ZSTD_pthread_mutex_destroy(a) pthread_mutex_destroy((a)) 85 #define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock((a)) 86 #define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock((a)) 87 88 #define ZSTD_pthread_cond_t pthread_cond_t 89 #define ZSTD_pthread_cond_init(a, b) pthread_cond_init((a), (b)) 90 #define ZSTD_pthread_cond_destroy(a) pthread_cond_destroy((a)) 91 #define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait((a), (b)) 92 #define ZSTD_pthread_cond_signal(a) pthread_cond_signal((a)) 93 #define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast((a)) 94 95 #define ZSTD_pthread_t pthread_t 96 #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) 97 #define ZSTD_pthread_join(a) pthread_join((a),NULL) 98 99 #else /* DEBUGLEVEL >= 1 */ 100 101 /* Debug implementation of threading. 102 * In this implementation we use pointers for mutexes and condition variables. 103 * This way, if we forget to init/destroy them the program will crash or ASAN 104 * will report leaks. 105 */ 106 107 #define ZSTD_pthread_mutex_t pthread_mutex_t* 108 int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr); 109 int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex); 110 #define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock(*(a)) 111 #define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock(*(a)) 112 113 #define ZSTD_pthread_cond_t pthread_cond_t* 114 int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr); 115 int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond); 116 #define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait(*(a), *(b)) 117 #define ZSTD_pthread_cond_signal(a) pthread_cond_signal(*(a)) 118 #define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast(*(a)) 119 120 #define ZSTD_pthread_t pthread_t 121 #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) 122 #define ZSTD_pthread_join(a) pthread_join((a),NULL) 123 124 #endif 125 126 #else /* ZSTD_MULTITHREAD not defined */ 127 /* No multithreading support */ 128 129 typedef int ZSTD_pthread_mutex_t; 130 #define ZSTD_pthread_mutex_init(a, b) ((void)(a), (void)(b), 0) 131 #define ZSTD_pthread_mutex_destroy(a) ((void)(a)) 132 #define ZSTD_pthread_mutex_lock(a) ((void)(a)) 133 #define ZSTD_pthread_mutex_unlock(a) ((void)(a)) 134 135 typedef int ZSTD_pthread_cond_t; 136 #define ZSTD_pthread_cond_init(a, b) ((void)(a), (void)(b), 0) 137 #define ZSTD_pthread_cond_destroy(a) ((void)(a)) 138 #define ZSTD_pthread_cond_wait(a, b) ((void)(a), (void)(b)) 139 #define ZSTD_pthread_cond_signal(a) ((void)(a)) 140 #define ZSTD_pthread_cond_broadcast(a) ((void)(a)) 141 142 /* do not use ZSTD_pthread_t */ 143 144 #endif /* ZSTD_MULTITHREAD */ 145 146 #if defined (__cplusplus) 147 } 148 #endif 149 150 #endif /* THREADING_H_938743 */ 151