casadi_threads.hpp
1 //
2 // MIT No Attribution
3 //
4 // Copyright (C) 2010-2023 Joel Andersson, Joris Gillis, Moritz Diehl, KU Leuven.
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy of this
7 // software and associated documentation files (the "Software"), to deal in the Software
8 // without restriction, including without limitation the rights to use, copy, modify,
9 // merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13 // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
14 // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
15 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
16 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
17 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18 //
19 
20 
21 // FILTER-MACROS OFF
22 
23 #define CASADI_THREAD_TYPE_NONE 0
24 #define CASADI_THREAD_TYPE_POSIX 1
25 #define CASADI_THREAD_TYPE_C11 2
26 #define CASADI_THREAD_TYPE_OMP 3
27 #define CASADI_THREAD_TYPE_WINDOWS 4
28 
29 #ifndef CASADI_THREAD_TYPE
30  #define CASADI_THREAD_TYPE CASADI_THREAD_TYPE_POSIX
31 #endif
32 
33 #if CASADI_THREAD_TYPE == CASADI_THREAD_TYPE_NONE
34  #ifndef CASADI_MUTEX_USE_STATIC_INIT
35  #define CASADI_MUTEX_USE_STATIC_INIT 0
36  #endif
37  #ifndef CASADI_MUTEX_TYPE
38  #define CASADI_MUTEX_TYPE int
39  #endif
40  #ifndef CASADI_MUTEX_LOCK
41  #define CASADI_MUTEX_LOCK(m) ((void)(m))
42  #endif
43  #ifndef CASADI_MUTEX_UNLOCK
44  #define CASADI_MUTEX_UNLOCK(m) ((void)(m))
45  #endif
46  #ifndef CASADI_MUTEX_INIT
47  #define CASADI_MUTEX_INIT(m) ((void)(m))
48  #endif
49  #ifndef CASADI_MUTEX_DESTROY
50  #define CASADI_MUTEX_DESTROY(m) ((void)(m))
51  #endif
52  #ifndef CASADI_MUTEX_STATIC_INIT
53  #define CASADI_MUTEX_STATIC_INIT 0
54  #endif
55 #elif CASADI_THREAD_TYPE == CASADI_THREAD_TYPE_POSIX
56  #ifndef CASADI_MUTEX_USE_STATIC_INIT
57  #define CASADI_MUTEX_USE_STATIC_INIT 1
58  #endif
59 
60  #include <pthread.h>
61  #ifndef CASADI_MUTEX_TYPE
62  #define CASADI_MUTEX_TYPE pthread_mutex_t
63  #endif
64  #ifndef CASADI_MUTEX_LOCK
65  #define CASADI_MUTEX_LOCK(m) pthread_mutex_lock(m)
66  #endif
67  #ifndef CASADI_MUTEX_UNLOCK
68  #define CASADI_MUTEX_UNLOCK(m) pthread_mutex_unlock(m)
69  #endif
70  #ifndef CASADI_MUTEX_INIT
71  #define CASADI_MUTEX_INIT(m) pthread_mutex_init(m, NULL)
72  #endif
73  #ifndef CASADI_MUTEX_DESTROY
74  #define CASADI_MUTEX_DESTROY(m) pthread_mutex_destroy(m)
75  #endif
76  #ifndef CASADI_MUTEX_STATIC_INIT
77  #define CASADI_MUTEX_STATIC_INIT PTHREAD_MUTEX_INITIALIZER
78  #endif
79 
80  #ifndef CASADI_THREAD_HANDLE
81  #define CASADI_THREAD_HANDLE pthread_t
82  #endif
83  #ifndef CASADI_THREAD_CREATE
84  #define CASADI_THREAD_CREATE(t, f, a) pthread_create(&(t), NULL, f, a)
85  #endif
86  #ifndef CASADI_THREAD_JOIN
87  #define CASADI_THREAD_JOIN(t) pthread_join(t, NULL)
88  #endif
89  #ifndef CASADI_THREAD_WORKER_RETURN
90  #define CASADI_THREAD_WORKER_RETURN void*
91  #endif
92  #ifndef CASADI_THREAD_WORKER_ARG
93  #define CASADI_THREAD_WORKER_ARG void*
94  #endif
95  #ifndef CASADI_THREAD_RETURN_VALUE
96  #define CASADI_THREAD_RETURN_VALUE NULL
97  #endif
98 
99 #elif CASADI_THREAD_TYPE == CASADI_THREAD_TYPE_C11
100  #ifndef CASADI_MUTEX_USE_STATIC_INIT
101  #define CASADI_MUTEX_USE_STATIC_INIT 0
102  #endif
103 
104  #include <threads.h>
105  #ifndef CASADI_MUTEX_TYPE
106  #define CASADI_MUTEX_TYPE mtx_t
107  #endif
108  #ifndef CASADI_MUTEX_LOCK
109  #define CASADI_MUTEX_LOCK(m) mtx_lock(m)
110  #endif
111  #ifndef CASADI_MUTEX_UNLOCK
112  #define CASADI_MUTEX_UNLOCK(m) mtx_unlock(m)
113  #endif
114  #ifndef CASADI_MUTEX_INIT
115  #define CASADI_MUTEX_INIT(m) mtx_init(m, mtx_plain)
116  #endif
117  #ifndef CASADI_MUTEX_DESTROY
118  #define CASADI_MUTEX_DESTROY(m) mtx_destroy(m)
119  #endif
120 
121  #ifndef CASADI_THREAD_HANDLE
122  #define CASADI_THREAD_HANDLE thrd_t
123  #endif
124  #ifndef CASADI_THREAD_CREATE
125  #define CASADI_THREAD_CREATE(t, f, a) thrd_create(&(t), f, a)
126  #endif
127  #ifndef CASADI_THREAD_JOIN
128  #define CASADI_THREAD_JOIN(t) thrd_join(t, NULL)
129  #endif
130  #ifndef CASADI_THREAD_WORKER_RETURN
131  #define CASADI_THREAD_WORKER_RETURN int
132  #endif
133  #ifndef CASADI_THREAD_WORKER_ARG
134  #define CASADI_THREAD_WORKER_ARG void*
135  #endif
136  #ifndef CASADI_THREAD_RETURN_VALUE
137  #define CASADI_THREAD_RETURN_VALUE 0
138  #endif
139 
140 #elif CASADI_THREAD_TYPE == CASADI_THREAD_TYPE_OMP
141  #ifndef CASADI_MUTEX_USE_STATIC_INIT
142  #define CASADI_MUTEX_USE_STATIC_INIT 0
143  #endif
144 
145  #include <omp.h>
146  #ifndef CASADI_MUTEX_TYPE
147  #define CASADI_MUTEX_TYPE omp_lock_t
148  #endif
149  #ifndef CASADI_MUTEX_LOCK
150  #define CASADI_MUTEX_LOCK(m) omp_set_lock(m)
151  #endif
152  #ifndef CASADI_MUTEX_UNLOCK
153  #define CASADI_MUTEX_UNLOCK(m) omp_unset_lock(m)
154  #endif
155  #ifndef CASADI_MUTEX_INIT
156  #define CASADI_MUTEX_INIT(m) omp_init_lock(m)
157  #endif
158  #ifndef CASADI_MUTEX_DESTROY
159  #define CASADI_MUTEX_DESTROY(m) omp_destroy_lock(m)
160  #endif
161 
162 #elif CASADI_THREAD_TYPE == CASADI_THREAD_TYPE_WINDOWS
163  #ifndef CASADI_MUTEX_USE_STATIC_INIT
164  #define CASADI_MUTEX_USE_STATIC_INIT 1
165  #endif
166 
167  #include <windows.h>
168  #ifdef CASADI_MUTEX_USE_STATIC_INIT
169  #ifndef CASADI_MUTEX_TYPE
170  #define CASADI_MUTEX_TYPE SRWLOCK
171  #endif
172  #ifndef CASADI_MUTEX_LOCK
173  #define CASADI_MUTEX_LOCK(m) AcquireSRWLockExclusive(m)
174  #endif
175  #ifndef CASADI_MUTEX_UNLOCK
176  #define CASADI_MUTEX_UNLOCK(m) ReleaseSRWLockExclusive(m)
177  #endif
178  #ifndef CASADI_MUTEX_INIT
179  #define CASADI_MUTEX_INIT(m) InitializeSRWLock(m)
180  #endif
181  #ifndef CASADI_MUTEX_DESTROY
182  #define CASADI_MUTEX_DESTROY(m) ((void)(m))
183  #endif
184  #ifndef CASADI_MUTEX_STATIC_INIT
185  #define CASADI_MUTEX_STATIC_INIT SRWLOCK_INIT
186  #endif
187  #else
188  #ifndef CASADI_MUTEX_TYPE
189  #define CASADI_MUTEX_TYPE CRITICAL_SECTION
190  #endif
191  #ifndef CASADI_MUTEX_LOCK
192  #define CASADI_MUTEX_LOCK(m) EnterCriticalSection(m)
193  #endif
194  #ifndef CASADI_MUTEX_UNLOCK
195  #define CASADI_MUTEX_UNLOCK(m) LeaveCriticalSection(m)
196  #endif
197  #ifndef CASADI_MUTEX_INIT
198  #define CASADI_MUTEX_INIT(m) InitializeCriticalSection(m)
199  #endif
200  #ifndef CASADI_MUTEX_DESTROY
201  #define CASADI_MUTEX_DESTROY(m) DeleteCriticalSection(m)
202  #endif
203  #endif
204 
205  #ifndef CASADI_THREAD_HANDLE
206  #define CASADI_THREAD_HANDLE HANDLE
207  #endif
208  #ifndef CASADI_THREAD_CREATE
209  #define CASADI_THREAD_CREATE(t, f, a) ((t) = CreateThread(NULL, 0, f, a, 0, NULL))
210  #endif
211  #ifndef CASADI_THREAD_JOIN
212  #define CASADI_THREAD_JOIN(t) (WaitForSingleObject(t, INFINITE), CloseHandle(t))
213  #endif
214  #ifndef CASADI_THREAD_WORKER_RETURN
215  #define CASADI_THREAD_WORKER_RETURN DWORD WINAPI
216  #endif
217  #ifndef CASADI_THREAD_WORKER_ARG
218  #define CASADI_THREAD_WORKER_ARG LPVOID
219  #endif
220  #ifndef CASADI_THREAD_RETURN_VALUE
221  #define CASADI_THREAD_RETURN_VALUE 0
222  #endif
223 
224 #else
225  #error "Unknown CASADI_THREAD_TYPE. Use: CASADI_THREAD_TYPE_NONE, CASADI_THREAD_TYPE_POSIX, CASADI_THREAD_TYPE_C11, CASADI_THREAD_TYPE_OMP, or CASADI_THREAD_TYPE_WINDOWS" // NOLINT(whitespace/line_length)
226 #endif
227 
228 // FILTER-MACROS ON