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