/src/zstd/lib/common/threading.h
Line | Count | Source (jump to first uncovered line) |
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(ZSTD_MULTITHREAD) && defined(_WIN32) |
20 | | |
21 | | /** |
22 | | * Windows minimalist Pthread Wrapper |
23 | | */ |
24 | | #ifdef WINVER |
25 | | # undef WINVER |
26 | | #endif |
27 | | #define WINVER 0x0600 |
28 | | |
29 | | #ifdef _WIN32_WINNT |
30 | | # undef _WIN32_WINNT |
31 | | #endif |
32 | | #define _WIN32_WINNT 0x0600 |
33 | | |
34 | | #ifndef WIN32_LEAN_AND_MEAN |
35 | | # define WIN32_LEAN_AND_MEAN |
36 | | #endif |
37 | | |
38 | | #undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */ |
39 | | #include <windows.h> |
40 | | #undef ERROR |
41 | | #define ERROR(name) ZSTD_ERROR(name) |
42 | | |
43 | | |
44 | | /* mutex */ |
45 | | #define ZSTD_pthread_mutex_t CRITICAL_SECTION |
46 | | #define ZSTD_pthread_mutex_init(a, b) ((void)(b), InitializeCriticalSection((a)), 0) |
47 | | #define ZSTD_pthread_mutex_destroy(a) DeleteCriticalSection((a)) |
48 | | #define ZSTD_pthread_mutex_lock(a) EnterCriticalSection((a)) |
49 | | #define ZSTD_pthread_mutex_unlock(a) LeaveCriticalSection((a)) |
50 | | |
51 | | /* condition variable */ |
52 | | #define ZSTD_pthread_cond_t CONDITION_VARIABLE |
53 | | #define ZSTD_pthread_cond_init(a, b) ((void)(b), InitializeConditionVariable((a)), 0) |
54 | | #define ZSTD_pthread_cond_destroy(a) ((void)(a)) |
55 | | #define ZSTD_pthread_cond_wait(a, b) SleepConditionVariableCS((a), (b), INFINITE) |
56 | | #define ZSTD_pthread_cond_signal(a) WakeConditionVariable((a)) |
57 | | #define ZSTD_pthread_cond_broadcast(a) WakeAllConditionVariable((a)) |
58 | | |
59 | | /* ZSTD_pthread_create() and ZSTD_pthread_join() */ |
60 | | typedef HANDLE ZSTD_pthread_t; |
61 | | |
62 | | int ZSTD_pthread_create(ZSTD_pthread_t* thread, const void* unused, |
63 | | void* (*start_routine) (void*), void* arg); |
64 | | |
65 | | int ZSTD_pthread_join(ZSTD_pthread_t thread); |
66 | | |
67 | | /** |
68 | | * add here more wrappers as required |
69 | | */ |
70 | | |
71 | | #elif defined(ZSTD_MULTITHREAD) /* posix assumed ; need a better detection method */ |
72 | | /* === POSIX Systems === */ |
73 | | # include <pthread.h> |
74 | | |
75 | | #if DEBUGLEVEL < 1 |
76 | | |
77 | | #define ZSTD_pthread_mutex_t pthread_mutex_t |
78 | | #define ZSTD_pthread_mutex_init(a, b) pthread_mutex_init((a), (b)) |
79 | | #define ZSTD_pthread_mutex_destroy(a) pthread_mutex_destroy((a)) |
80 | | #define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock((a)) |
81 | | #define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock((a)) |
82 | | |
83 | | #define ZSTD_pthread_cond_t pthread_cond_t |
84 | | #define ZSTD_pthread_cond_init(a, b) pthread_cond_init((a), (b)) |
85 | | #define ZSTD_pthread_cond_destroy(a) pthread_cond_destroy((a)) |
86 | | #define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait((a), (b)) |
87 | | #define ZSTD_pthread_cond_signal(a) pthread_cond_signal((a)) |
88 | | #define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast((a)) |
89 | | |
90 | | #define ZSTD_pthread_t pthread_t |
91 | | #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) |
92 | | #define ZSTD_pthread_join(a) pthread_join((a),NULL) |
93 | | |
94 | | #else /* DEBUGLEVEL >= 1 */ |
95 | | |
96 | | /* Debug implementation of threading. |
97 | | * In this implementation we use pointers for mutexes and condition variables. |
98 | | * This way, if we forget to init/destroy them the program will crash or ASAN |
99 | | * will report leaks. |
100 | | */ |
101 | | |
102 | 0 | #define ZSTD_pthread_mutex_t pthread_mutex_t* |
103 | | int ZSTD_pthread_mutex_init(ZSTD_pthread_mutex_t* mutex, pthread_mutexattr_t const* attr); |
104 | | int ZSTD_pthread_mutex_destroy(ZSTD_pthread_mutex_t* mutex); |
105 | 0 | #define ZSTD_pthread_mutex_lock(a) pthread_mutex_lock(*(a)) |
106 | 0 | #define ZSTD_pthread_mutex_unlock(a) pthread_mutex_unlock(*(a)) |
107 | | |
108 | 0 | #define ZSTD_pthread_cond_t pthread_cond_t* |
109 | | int ZSTD_pthread_cond_init(ZSTD_pthread_cond_t* cond, pthread_condattr_t const* attr); |
110 | | int ZSTD_pthread_cond_destroy(ZSTD_pthread_cond_t* cond); |
111 | 0 | #define ZSTD_pthread_cond_wait(a, b) pthread_cond_wait(*(a), *(b)) |
112 | 0 | #define ZSTD_pthread_cond_signal(a) pthread_cond_signal(*(a)) |
113 | 0 | #define ZSTD_pthread_cond_broadcast(a) pthread_cond_broadcast(*(a)) |
114 | | |
115 | 0 | #define ZSTD_pthread_t pthread_t |
116 | 0 | #define ZSTD_pthread_create(a, b, c, d) pthread_create((a), (b), (c), (d)) |
117 | 0 | #define ZSTD_pthread_join(a) pthread_join((a),NULL) |
118 | | |
119 | | #endif |
120 | | |
121 | | #else /* ZSTD_MULTITHREAD not defined */ |
122 | | /* No multithreading support */ |
123 | | |
124 | | typedef int ZSTD_pthread_mutex_t; |
125 | | #define ZSTD_pthread_mutex_init(a, b) ((void)(a), (void)(b), 0) |
126 | | #define ZSTD_pthread_mutex_destroy(a) ((void)(a)) |
127 | | #define ZSTD_pthread_mutex_lock(a) ((void)(a)) |
128 | | #define ZSTD_pthread_mutex_unlock(a) ((void)(a)) |
129 | | |
130 | | typedef int ZSTD_pthread_cond_t; |
131 | | #define ZSTD_pthread_cond_init(a, b) ((void)(a), (void)(b), 0) |
132 | | #define ZSTD_pthread_cond_destroy(a) ((void)(a)) |
133 | | #define ZSTD_pthread_cond_wait(a, b) ((void)(a), (void)(b)) |
134 | | #define ZSTD_pthread_cond_signal(a) ((void)(a)) |
135 | | #define ZSTD_pthread_cond_broadcast(a) ((void)(a)) |
136 | | |
137 | | /* do not use ZSTD_pthread_t */ |
138 | | |
139 | | #endif /* ZSTD_MULTITHREAD */ |
140 | | |
141 | | |
142 | | #endif /* THREADING_H_938743 */ |