public API
(
switch to internal
)
-
revision 3.8.0
casadi
core
runtime
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