19#ifndef __STARPU_THREAD_UTIL_H__
20#define __STARPU_THREAD_UTIL_H__
30#if !(defined(_MSC_VER) && !defined(BUILDING_STARPU))
35#define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where) \
37 int p_ret = starpu_pthread_create_on((name), (thread), (attr), (routine), (arg), (where)); \
38 if (STARPU_UNLIKELY(p_ret != 0)) \
41 "%s:%d starpu_pthread_create_on: %s\n", \
42 __FILE__, __LINE__, strerror(p_ret)); \
48#define STARPU_PTHREAD_CREATE(thread, attr, routine, arg) \
50 int p_ret = starpu_pthread_create((thread), (attr), (routine), (arg)); \
51 if (STARPU_UNLIKELY(p_ret != 0)) \
54 "%s:%d starpu_pthread_create: %s\n", \
55 __FILE__, __LINE__, strerror(p_ret)); \
61#define STARPU_PTHREAD_JOIN(thread, retval) \
63 int p_ret = starpu_pthread_join((thread), (retval)); \
64 if (STARPU_UNLIKELY(p_ret != 0)) \
67 "%s:%d starpu_pthread_join: %s\n", \
68 __FILE__, __LINE__, strerror(p_ret)); \
78#define _STARPU_PTHREAD_MUTEX_INIT(mutex, attr) \
80 int p_ret = starpu_pthread_mutex_init((mutex), (attr)); \
81 if (STARPU_UNLIKELY(p_ret)) \
84 "%s:%d starpu_pthread_mutex_init: %s\n", \
85 __FILE__, __LINE__, strerror(p_ret)); \
91#ifdef STARPU_PTHREAD_MUTEX_INITIALIZER_ZERO
92#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) \
95 memset(mutex, 0, sizeof(*mutex)); \
97 _STARPU_PTHREAD_MUTEX_INIT(mutex, attr); \
100#define STARPU_PTHREAD_MUTEX_INIT0(mutex, attr) \
103 _STARPU_PTHREAD_MUTEX_INIT(mutex, attr); \
107#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) _STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
108#define STARPU_PTHREAD_MUTEX_INIT0(mutex, attr) _STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
111#define STARPU_PTHREAD_MUTEX_DESTROY(mutex) \
113 int p_ret = starpu_pthread_mutex_destroy(mutex); \
114 if (STARPU_UNLIKELY(p_ret)) \
117 "%s:%d starpu_pthread_mutex_destroy: %s\n", \
118 __FILE__, __LINE__, strerror(p_ret)); \
125#define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line) \
126 starpu_pthread_mutex_check_sched((mutex), file, line)
128#define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line)
131#define STARPU_PTHREAD_MUTEX_LOCK(mutex) \
133 int p_ret = starpu_pthread_mutex_lock(mutex); \
134 if (STARPU_UNLIKELY(p_ret)) \
137 "%s:%d starpu_pthread_mutex_lock: %s\n", \
138 __FILE__, __LINE__, strerror(p_ret)); \
141 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \
145#define STARPU_PTHREAD_MUTEX_LOCK_SCHED(mutex) \
147 int p_ret = starpu_pthread_mutex_lock_sched(mutex); \
148 if (STARPU_UNLIKELY(p_ret)) \
151 "%s:%d starpu_pthread_mutex_lock_sched: %s\n", \
152 __FILE__, __LINE__, strerror(p_ret)); \
158#define STARPU_PTHREAD_MUTEX_TRYLOCK(mutex) \
159 _starpu_pthread_mutex_trylock(mutex, __FILE__, __LINE__)
160static STARPU_INLINE
int _starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex,
char *file,
int line)
162 int p_ret = starpu_pthread_mutex_trylock(mutex);
166 "%s:%d starpu_pthread_mutex_trylock: %s\n",
167 file, line, strerror(p_ret));
170 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line);
174#define STARPU_PTHREAD_MUTEX_TRYLOCK_SCHED(mutex) \
175 _starpu_pthread_mutex_trylock_sched(mutex, __FILE__, __LINE__)
176static STARPU_INLINE
int _starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex,
char *file,
int line)
178 int p_ret = starpu_pthread_mutex_trylock_sched(mutex);
182 "%s:%d starpu_pthread_mutex_trylock_sched: %s\n",
183 file, line, strerror(p_ret));
189#define STARPU_PTHREAD_MUTEX_UNLOCK(mutex) \
191 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \
192 int p_ret = starpu_pthread_mutex_unlock(mutex); \
193 if (STARPU_UNLIKELY(p_ret)) \
196 "%s:%d starpu_pthread_mutex_unlock: %s\n", \
197 __FILE__, __LINE__, strerror(p_ret)); \
203#define STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(mutex) \
205 int p_ret = starpu_pthread_mutex_unlock_sched(mutex); \
206 if (STARPU_UNLIKELY(p_ret)) \
209 "%s:%d starpu_pthread_mutex_unlock_sched: %s\n", \
210 __FILE__, __LINE__, strerror(p_ret)); \
219#define STARPU_PTHREAD_KEY_CREATE(key, destr) \
221 int p_ret = starpu_pthread_key_create((key), (destr)); \
222 if (STARPU_UNLIKELY(p_ret != 0)) \
225 "%s:%d starpu_pthread_key_create: %s\n", \
226 __FILE__, __LINE__, strerror(p_ret)); \
231#define STARPU_PTHREAD_KEY_DELETE(key) \
233 int p_ret = starpu_pthread_key_delete((key)); \
234 if (STARPU_UNLIKELY(p_ret != 0)) \
237 "%s:%d starpu_pthread_key_delete: %s\n", \
238 __FILE__, __LINE__, strerror(p_ret)); \
243#define STARPU_PTHREAD_SETSPECIFIC(key, ptr) \
245 int p_ret = starpu_pthread_setspecific((key), (ptr)); \
246 if (STARPU_UNLIKELY(p_ret != 0)) \
249 "%s:%d starpu_pthread_setspecific: %s\n", \
250 __FILE__, __LINE__, strerror(p_ret)); \
255#define STARPU_PTHREAD_GETSPECIFIC(key) starpu_pthread_getspecific((key))
260#define _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) \
262 int p_ret = starpu_pthread_rwlock_init((rwlock), (attr)); \
263 if (STARPU_UNLIKELY(p_ret)) \
266 "%s:%d starpu_pthread_rwlock_init: %s\n", \
267 __FILE__, __LINE__, strerror(p_ret)); \
273#ifdef STARPU_PTHREAD_RWLOCK_INITIALIZER_ZERO
274#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) \
277 memset(rwlock, 0, sizeof(*rwlock)); \
279 _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr); \
282#define STARPU_PTHREAD_RWLOCK_INIT0(rwlock, attr) \
285 _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr); \
289#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
290#define STARPU_PTHREAD_RWLOCK_INIT0(rwlock, attr) _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
293#define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock) \
295 int p_ret = starpu_pthread_rwlock_rdlock(rwlock); \
296 if (STARPU_UNLIKELY(p_ret)) \
299 "%s:%d starpu_pthread_rwlock_rdlock: %s\n", \
300 __FILE__, __LINE__, strerror(p_ret)); \
306#define STARPU_PTHREAD_RWLOCK_TRYRDLOCK(rwlock) \
307 _starpu_pthread_rwlock_tryrdlock(rwlock, __FILE__, __LINE__)
308static STARPU_INLINE
int _starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock,
char *file,
int line)
310 int p_ret = starpu_pthread_rwlock_tryrdlock(rwlock);
314 "%s:%d starpu_pthread_rwlock_tryrdlock: %s\n",
315 file, line, strerror(p_ret));
321#define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock) \
323 int p_ret = starpu_pthread_rwlock_wrlock(rwlock); \
324 if (STARPU_UNLIKELY(p_ret)) \
327 "%s:%d starpu_pthread_rwlock_wrlock: %s\n", \
328 __FILE__, __LINE__, strerror(p_ret)); \
334#define STARPU_PTHREAD_RWLOCK_TRYWRLOCK(rwlock) \
335 _starpu_pthread_rwlock_trywrlock(rwlock, __FILE__, __LINE__)
336static STARPU_INLINE
int _starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock,
char *file,
int line)
338 int p_ret = starpu_pthread_rwlock_trywrlock(rwlock);
342 "%s:%d starpu_pthread_rwlock_trywrlock: %s\n",
343 file, line, strerror(p_ret));
349#define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock) \
351 int p_ret = starpu_pthread_rwlock_unlock(rwlock); \
352 if (STARPU_UNLIKELY(p_ret)) \
355 "%s:%d starpu_pthread_rwlock_unlock: %s\n", \
356 __FILE__, __LINE__, strerror(p_ret)); \
362#define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock) \
364 int p_ret = starpu_pthread_rwlock_destroy(rwlock); \
365 if (STARPU_UNLIKELY(p_ret)) \
368 "%s:%d starpu_pthread_rwlock_destroy: %s\n", \
369 __FILE__, __LINE__, strerror(p_ret)); \
378#define _STARPU_PTHREAD_COND_INIT(cond, attr) \
380 int p_ret = starpu_pthread_cond_init((cond), (attr)); \
381 if (STARPU_UNLIKELY(p_ret)) \
384 "%s:%d starpu_pthread_cond_init: %s\n", \
385 __FILE__, __LINE__, strerror(p_ret)); \
391#ifdef STARPU_PTHREAD_COND_INITIALIZER_ZERO
392#define STARPU_PTHREAD_COND_INIT(cond, attr) \
395 memset(cond, 0, sizeof(*cond)); \
397 _STARPU_PTHREAD_COND_INIT(cond, attr); \
400#define STARPU_PTHREAD_COND_INIT0(cond, attr) \
403 _STARPU_PTHREAD_COND_INIT(cond, attr); \
407#define STARPU_PTHREAD_COND_INIT(cond, attr) _STARPU_PTHREAD_COND_INIT(cond, attr)
408#define STARPU_PTHREAD_COND_INIT0(cond, attr) _STARPU_PTHREAD_COND_INIT(cond, attr)
411#define STARPU_PTHREAD_COND_DESTROY(cond) \
413 int p_ret = starpu_pthread_cond_destroy(cond); \
414 if (STARPU_UNLIKELY(p_ret)) \
417 "%s:%d starpu_pthread_cond_destroy: %s\n", \
418 __FILE__, __LINE__, strerror(p_ret)); \
424#define STARPU_PTHREAD_COND_SIGNAL(cond) \
426 int p_ret = starpu_pthread_cond_signal(cond); \
427 if (STARPU_UNLIKELY(p_ret)) \
430 "%s:%d starpu_pthread_cond_signal: %s\n", \
431 __FILE__, __LINE__, strerror(p_ret)); \
437#define STARPU_PTHREAD_COND_BROADCAST(cond) \
439 int p_ret = starpu_pthread_cond_broadcast(cond); \
440 if (STARPU_UNLIKELY(p_ret)) \
443 "%s:%d starpu_pthread_cond_broadcast: %s\n", \
444 __FILE__, __LINE__, strerror(p_ret)); \
450#define STARPU_PTHREAD_COND_WAIT(cond, mutex) \
452 int p_ret = starpu_pthread_cond_wait((cond), (mutex)); \
453 if (STARPU_UNLIKELY(p_ret)) \
456 "%s:%d starpu_pthread_cond_wait: %s\n", \
457 __FILE__, __LINE__, strerror(p_ret)); \
465#define STARPU_PTHREAD_COND_TIMEDWAIT(cond, mutex, abstime) \
466 _starpu_pthread_cond_timedwait(cond, mutex, abstime, __FILE__, __LINE__)
467static STARPU_INLINE
int _starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex,
const struct timespec *abstime,
char *file,
int line)
469 int p_ret = starpu_pthread_cond_timedwait(cond, mutex, abstime);
473 "%s:%d starpu_pthread_cond_timedwait: %s\n",
474 file, line, strerror(p_ret));
485#define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count) \
487 int p_ret = starpu_pthread_barrier_init((barrier), (attr), (count)); \
488 if (STARPU_UNLIKELY(p_ret)) \
491 "%s:%d starpu_pthread_barrier_init: %s\n", \
492 __FILE__, __LINE__, strerror(p_ret)); \
498#define STARPU_PTHREAD_BARRIER_DESTROY(barrier) \
500 int p_ret = starpu_pthread_barrier_destroy((barrier)); \
501 if (STARPU_UNLIKELY(p_ret)) \
504 "%s:%d starpu_pthread_barrier_destroy: %s\n", \
505 __FILE__, __LINE__, strerror(p_ret)); \
511#define STARPU_PTHREAD_BARRIER_WAIT(barrier) \
513 int p_ret = starpu_pthread_barrier_wait((barrier)); \
514 if (STARPU_UNLIKELY(!((p_ret == 0) || (p_ret == STARPU_PTHREAD_BARRIER_SERIAL_THREAD)))) \
517 "%s:%d starpu_pthread_barrier_wait: %s\n", \
518 __FILE__, __LINE__, strerror(p_ret)); \