xref: /aosp_15_r20/external/zstd/lib/common/threading.h (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
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