StarPU Handbook
starpu_thread.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2013,2015-2016 Inria
4  * Copyright (C) 2010-2015 CNRS
5  * Copyright (C) 2010,2012-2018 Université de Bordeaux
6  *
7  * StarPU is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU Lesser General Public License as published by
9  * the Free Software Foundation; either version 2.1 of the License, or (at
10  * your option) any later version.
11  *
12  * StarPU is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *
16  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
17  */
18 
19 #ifndef __STARPU_THREAD_H__
20 #define __STARPU_THREAD_H__
21 
22 #include <starpu_config.h>
23 #include <starpu_util.h>
24 #ifdef STARPU_SIMGRID
25 #ifdef STARPU_HAVE_XBT_SYNCHRO_H
26 #include <xbt/synchro.h>
27 #else
28 #include <xbt/synchro_core.h>
29 #endif
30 #ifdef STARPU_HAVE_SIMGRID_MSG_H
31 #include <simgrid/msg.h>
32 #else
33 #include <msg/msg.h>
34 #endif
35 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU)
36 #include <pthread.h>
37 #endif
38 #include <stdint.h>
39 
40 #ifdef __cplusplus
41 extern "C"
42 {
43 #endif
44 
45 /*
46  * Encapsulation of the pthread_create function.
47  */
48 
49 #ifdef STARPU_SIMGRID
50 
51 typedef msg_process_t starpu_pthread_t;
52 typedef int starpu_pthread_attr_t;
53 
54 int starpu_pthread_create_on(char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg, msg_host_t host);
55 int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
56 int starpu_pthread_join(starpu_pthread_t thread, void **retval);
57 int starpu_pthread_exit(void *retval) STARPU_ATTRIBUTE_NORETURN;
58 int starpu_pthread_attr_init(starpu_pthread_attr_t *attr);
59 int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr);
60 int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate);
61 
62 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* STARPU_SIMGRID */
63 
64 typedef pthread_t starpu_pthread_t;
65 typedef pthread_attr_t starpu_pthread_attr_t;
66 
67 #define starpu_pthread_create pthread_create
68 #define starpu_pthread_create_on(name, thread, attr, routine, arg, where) starpu_pthread_create(thread, attr, routine, arg)
69 #define starpu_pthread_join pthread_join
70 #define starpu_pthread_exit pthread_exit
71 #define starpu_pthread_attr_init pthread_attr_init
72 #define starpu_pthread_attr_destroy pthread_attr_destroy
73 #define starpu_pthread_attr_setdetachstate pthread_attr_setdetachstate
74 
75 #endif /* STARPU_SIMGRID, _MSC_VER */
76 
77 #ifdef STARPU_HAVE_PTHREAD_SETNAME_NP
78 #ifdef STARPU_HAVE_DARWIN
79 #define starpu_pthread_setname(name) pthread_setname_np(name)
80 #else
81 #define starpu_pthread_setname(name) pthread_setname_np(pthread_self(), name)
82 #endif
83 #else
84 #define starpu_pthread_setname(name)
85 #endif
86 
87 /*
88  * Encapsulation of the pthread_mutex_* functions.
89  */
90 
91 #ifdef STARPU_SIMGRID
92 typedef xbt_mutex_t starpu_pthread_mutex_t;
93 typedef int starpu_pthread_mutexattr_t;
94 
95 #define STARPU_PTHREAD_MUTEX_INITIALIZER NULL
96 
97 int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr);
98 int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex);
99 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
100 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
101 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
102 int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type);
103 int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type);
104 int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr);
105 int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr);
106 
107 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
108 
109 typedef pthread_mutex_t starpu_pthread_mutex_t;
110 typedef pthread_mutexattr_t starpu_pthread_mutexattr_t;
111 
112 #define starpu_pthread_mutex_init pthread_mutex_init
113 #define starpu_pthread_mutex_destroy pthread_mutex_destroy
114 #define starpu_pthread_mutexattr_gettype pthread_mutexattr_gettype
115 #define starpu_pthread_mutexattr_settype pthread_mutexattr_settype
116 #define starpu_pthread_mutexattr_destroy pthread_mutexattr_destroy
117 #define starpu_pthread_mutexattr_init pthread_mutexattr_init
118 
119 #ifdef STARPU_FXT_LOCK_TRACES
120 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
121 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
122 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
123 #else
124 #define starpu_pthread_mutex_lock pthread_mutex_lock
125 #define starpu_pthread_mutex_unlock pthread_mutex_unlock
126 #define starpu_pthread_mutex_trylock pthread_mutex_trylock
127 #endif
128 
129 #define STARPU_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
130 
131 #endif /* STARPU_SIMGRID, _MSC_VER */
132 
133 #if !defined(_MSC_VER) || defined(BUILDING_STARPU)
134 int starpu_pthread_mutex_lock_sched(starpu_pthread_mutex_t *mutex);
135 int starpu_pthread_mutex_unlock_sched(starpu_pthread_mutex_t *mutex);
136 int starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex);
137 void starpu_pthread_mutex_check_sched(starpu_pthread_mutex_t *mutex, char *file, int line);
138 #endif
139 
140 /*
141  * Encapsulation of the pthread_key_* functions.
142  */
143 #ifdef STARPU_SIMGRID
144 
145 typedef int starpu_pthread_key_t;
146 int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *));
147 int starpu_pthread_key_delete(starpu_pthread_key_t key);
148 int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer);
149 void *starpu_pthread_getspecific(starpu_pthread_key_t key);
150 
151 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
152 
153 typedef pthread_key_t starpu_pthread_key_t;
154 
155 #define starpu_pthread_key_create pthread_key_create
156 #define starpu_pthread_key_delete pthread_key_delete
157 #define starpu_pthread_setspecific pthread_setspecific
158 #define starpu_pthread_getspecific pthread_getspecific
159 
160 #endif /* STARPU_SIMGRID, _MSC_VER */
161 
162 /*
163  * Encapsulation of the pthread_cond_* functions.
164  */
165 
166 #ifdef STARPU_SIMGRID
167 
168 typedef xbt_cond_t starpu_pthread_cond_t;
169 typedef int starpu_pthread_condattr_t;
170 #define STARPU_PTHREAD_COND_INITIALIZER NULL
171 
172 int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr);
173 int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond);
174 int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond);
175 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
176 int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime);
177 int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond);
178 
179 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
180 
181 typedef pthread_cond_t starpu_pthread_cond_t;
182 typedef pthread_condattr_t starpu_pthread_condattr_t;
183 #define STARPU_PTHREAD_COND_INITIALIZER PTHREAD_COND_INITIALIZER
184 
185 #define starpu_pthread_cond_init pthread_cond_init
186 #define starpu_pthread_cond_signal pthread_cond_signal
187 #define starpu_pthread_cond_broadcast pthread_cond_broadcast
188 
189 #ifdef STARPU_FXT_LOCK_TRACES
190 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
191 #else
192 #define starpu_pthread_cond_wait pthread_cond_wait
193 #endif
194 
195 #define starpu_pthread_cond_timedwait pthread_cond_timedwait
196 #define starpu_pthread_cond_destroy pthread_cond_destroy
197 
198 #endif /* STARPU_SIMGRID, _MSC_VER */
199 
200 /*
201  * Encapsulation of the pthread_rwlock_* functions.
202  */
203 
204 #ifdef STARPU_SIMGRID
205 
206 typedef xbt_mutex_t starpu_pthread_rwlock_t;
207 typedef int starpu_pthread_rwlockattr_t;
208 
209 int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr);
210 int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock);
211 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
212 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
213 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
214 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
215 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
216 
217 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
218 
219 typedef pthread_rwlock_t starpu_pthread_rwlock_t;
220 typedef pthread_rwlockattr_t starpu_pthread_rwlockattr_t;
221 
222 #define starpu_pthread_rwlock_init pthread_rwlock_init
223 #define starpu_pthread_rwlock_destroy pthread_rwlock_destroy
224 
225 #ifdef STARPU_FXT_LOCK_TRACES
226 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
227 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
228 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
229 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
230 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
231 #else
232 #define starpu_pthread_rwlock_rdlock pthread_rwlock_rdlock
233 #define starpu_pthread_rwlock_tryrdlock pthread_rwlock_tryrdlock
234 #define starpu_pthread_rwlock_wrlock pthread_rwlock_wrlock
235 #define starpu_pthread_rwlock_trywrlock pthread_rwlock_trywrlock
236 #define starpu_pthread_rwlock_unlock pthread_rwlock_unlock
237 #endif
238 
239 #endif /* STARPU_SIMGRID, _MSC_VER */
240 
241 /*
242  * Encapsulation of the pthread_barrier_* functions.
243  */
244 
245 #if defined(STARPU_SIMGRID) || (!defined(STARPU_HAVE_PTHREAD_BARRIER) && (!defined(_MSC_VER) || defined(BUILDING_STARPU)))
246 
247 #if defined(STARPU_SIMGRID) && (defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) || defined(xbt_barrier_init))
248 typedef xbt_bar_t starpu_pthread_barrier_t;
249 typedef int starpu_pthread_barrierattr_t;
250 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD XBT_BARRIER_SERIAL_PROCESS
251 #else
252 typedef struct {
253  starpu_pthread_mutex_t mutex;
254  starpu_pthread_cond_t cond;
255  starpu_pthread_cond_t cond_destroy;
256  unsigned count;
257  unsigned done;
258  unsigned busy;
259 } starpu_pthread_barrier_t;
260 typedef int starpu_pthread_barrierattr_t;
261 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1
262 #endif
263 
264 int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count);
265 int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier);
266 int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier);
267 
268 #elif !defined(_MSC_VER) /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER */
269 
270 typedef pthread_barrier_t starpu_pthread_barrier_t;
271 typedef pthread_barrierattr_t starpu_pthread_barrierattr_t;
272 
273 #define starpu_pthread_barrier_init pthread_barrier_init
274 #define starpu_pthread_barrier_destroy pthread_barrier_destroy
275 
276 #ifdef STARPU_FXT_LOCK_TRACES
277 int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier);
278 #else
279 #define starpu_pthread_barrier_wait pthread_barrier_wait
280 #endif
281 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD PTHREAD_BARRIER_SERIAL_THREAD
282 
283 #endif /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER, _MSC_VER */
284 
285 /*
286  * Encapsulation of the pthread_spin_* functions.
287  */
288 
289 #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)
290 
291 typedef struct
292 {
293 #ifdef STARPU_SIMGRID
294  int taken;
295 #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)
296  unsigned taken STARPU_ATTRIBUTE_ALIGNED(16);
297 #else /* we only have a trivial implementation yet ! */
298  uint32_t taken STARPU_ATTRIBUTE_ALIGNED(16);
299 #endif
301 
307 
308 #elif !defined(_MSC_VER) /* !( defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */
309 
310 typedef pthread_spinlock_t starpu_pthread_spinlock_t;
311 #define starpu_pthread_spin_init pthread_spin_init
312 #define starpu_pthread_spin_destroy pthread_spin_destroy
313 #define starpu_pthread_spin_lock pthread_spin_lock
314 #define starpu_pthread_spin_trylock pthread_spin_trylock
315 #define starpu_pthread_spin_unlock pthread_spin_unlock
316 
317 #endif /* !( defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */
318 
319 /*
320  * Other needed pthread definitions
321  */
322 
323 #if defined(_MSC_VER) && !defined(BUILDING_STARPU)
324 typedef void* starpu_pthread_rwlock_t;
325 typedef void* starpu_pthread_mutex_t;
326 typedef void* starpu_pthread_cond_t;
327 typedef void* starpu_pthread_barrier_t;
328 #endif /* _MSC_VER */
329 
330 #ifdef __cplusplus
331 }
332 #endif
333 
334 #endif /* __STARPU_THREAD_H__ */
335 
336 
int starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex)
int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier)
void * starpu_pthread_getspecific(starpu_pthread_key_t key)
#define STARPU_ATTRIBUTE_ALIGNED(size)
Definition: starpu_util.h:65
int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr)
int starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier)
int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr)
int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr)
int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer)
int starpu_pthread_exit(void *retval) STARPU_ATTRIBUTE_NORETURN
int starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared)
int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count)
int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond)
int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex)
int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond)
int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type)
int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime)
Definition: starpu_thread.h:291
int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock)
Definition: starpu_thread.h:252
int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type)
int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr)
int starpu_pthread_join(starpu_pthread_t thread, void **retval)
int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr)
int starpu_pthread_key_delete(starpu_pthread_key_t key)
int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr)
int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int starpu_pthread_attr_init(starpu_pthread_attr_t *attr)
int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate)
int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock)
int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond)
int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_key_create(starpu_pthread_key_t *key, void(*destr_function)(void *))