19#ifndef __STARPU_THREAD_UTIL_H__
20#define __STARPU_THREAD_UTIL_H__
26#if !(defined(_MSC_VER) && !defined(BUILDING_STARPU))
31#define STARPU_PTHREAD_CREATE_ON(name, thread, attr, routine, arg, where) \
33 int p_ret = starpu_pthread_create_on((name), (thread), (attr), (routine), (arg), (where)); \
34 if (STARPU_UNLIKELY(p_ret != 0)) \
37 "%s:%d starpu_pthread_create_on: %s\n", \
38 __FILE__, __LINE__, strerror(p_ret)); \
44#define STARPU_PTHREAD_CREATE(thread, attr, routine, arg) \
46 int p_ret = starpu_pthread_create((thread), (attr), (routine), (arg)); \
47 if (STARPU_UNLIKELY(p_ret != 0)) \
50 "%s:%d starpu_pthread_create: %s\n", \
51 __FILE__, __LINE__, strerror(p_ret)); \
57#define STARPU_PTHREAD_JOIN(thread, retval) \
59 int p_ret = starpu_pthread_join((thread), (retval)); \
60 if (STARPU_UNLIKELY(p_ret != 0)) \
63 "%s:%d starpu_pthread_join: %s\n", \
64 __FILE__, __LINE__, strerror(p_ret)); \
74#define _STARPU_PTHREAD_MUTEX_INIT(mutex, attr) \
76 int p_ret = starpu_pthread_mutex_init((mutex), (attr)); \
77 if (STARPU_UNLIKELY(p_ret)) \
80 "%s:%d starpu_pthread_mutex_init: %s\n", \
81 __FILE__, __LINE__, strerror(p_ret)); \
87#ifdef STARPU_PTHREAD_MUTEX_INITIALIZER_ZERO
88#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) \
91 memset(mutex, 0, sizeof(*mutex)); \
93 _STARPU_PTHREAD_MUTEX_INIT(mutex, attr); \
96#define STARPU_PTHREAD_MUTEX_INIT0(mutex, attr) \
99 _STARPU_PTHREAD_MUTEX_INIT(mutex, attr); \
103#define STARPU_PTHREAD_MUTEX_INIT(mutex, attr) _STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
104#define STARPU_PTHREAD_MUTEX_INIT0(mutex, attr) _STARPU_PTHREAD_MUTEX_INIT(mutex, attr)
107#define STARPU_PTHREAD_MUTEX_DESTROY(mutex) \
109 int p_ret = starpu_pthread_mutex_destroy(mutex); \
110 if (STARPU_UNLIKELY(p_ret)) \
113 "%s:%d starpu_pthread_mutex_destroy: %s\n", \
114 __FILE__, __LINE__, strerror(p_ret)); \
121#define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line) \
122 starpu_pthread_mutex_check_sched((mutex), file, line)
124#define _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line)
127#define STARPU_PTHREAD_MUTEX_LOCK(mutex) \
129 int p_ret = starpu_pthread_mutex_lock(mutex); \
130 if (STARPU_UNLIKELY(p_ret)) \
133 "%s:%d starpu_pthread_mutex_lock: %s\n", \
134 __FILE__, __LINE__, strerror(p_ret)); \
137 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \
141#define STARPU_PTHREAD_MUTEX_LOCK_SCHED(mutex) \
143 int p_ret = starpu_pthread_mutex_lock_sched(mutex); \
144 if (STARPU_UNLIKELY(p_ret)) \
147 "%s:%d starpu_pthread_mutex_lock_sched: %s\n", \
148 __FILE__, __LINE__, strerror(p_ret)); \
154#define STARPU_PTHREAD_MUTEX_TRYLOCK(mutex) \
155 _starpu_pthread_mutex_trylock(mutex, __FILE__, __LINE__)
156static STARPU_INLINE
int _starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex,
char *file,
int line)
162 "%s:%d starpu_pthread_mutex_trylock: %s\n",
163 file, line, strerror(p_ret));
166 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, file, line);
170#define STARPU_PTHREAD_MUTEX_TRYLOCK_SCHED(mutex) \
171 _starpu_pthread_mutex_trylock_sched(mutex, __FILE__, __LINE__)
172static STARPU_INLINE
int _starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex,
char *file,
int line)
174 int p_ret = starpu_pthread_mutex_trylock_sched(mutex);
178 "%s:%d starpu_pthread_mutex_trylock_sched: %s\n",
179 file, line, strerror(p_ret));
185#define STARPU_PTHREAD_MUTEX_UNLOCK(mutex) \
187 _STARPU_CHECK_NOT_SCHED_MUTEX(mutex, __FILE__, __LINE__); \
188 int p_ret = starpu_pthread_mutex_unlock(mutex); \
189 if (STARPU_UNLIKELY(p_ret)) \
192 "%s:%d starpu_pthread_mutex_unlock: %s\n", \
193 __FILE__, __LINE__, strerror(p_ret)); \
199#define STARPU_PTHREAD_MUTEX_UNLOCK_SCHED(mutex) \
201 int p_ret = starpu_pthread_mutex_unlock_sched(mutex); \
202 if (STARPU_UNLIKELY(p_ret)) \
205 "%s:%d starpu_pthread_mutex_unlock_sched: %s\n", \
206 __FILE__, __LINE__, strerror(p_ret)); \
215#define STARPU_PTHREAD_KEY_CREATE(key, destr) \
217 int p_ret = starpu_pthread_key_create((key), (destr)); \
218 if (STARPU_UNLIKELY(p_ret != 0)) \
221 "%s:%d starpu_pthread_key_create: %s\n", \
222 __FILE__, __LINE__, strerror(p_ret)); \
227#define STARPU_PTHREAD_KEY_DELETE(key) \
229 int p_ret = starpu_pthread_key_delete((key)); \
230 if (STARPU_UNLIKELY(p_ret != 0)) \
233 "%s:%d starpu_pthread_key_delete: %s\n", \
234 __FILE__, __LINE__, strerror(p_ret)); \
239#define STARPU_PTHREAD_SETSPECIFIC(key, ptr) \
241 int p_ret = starpu_pthread_setspecific((key), (ptr)); \
242 if (STARPU_UNLIKELY(p_ret != 0)) \
245 "%s:%d starpu_pthread_setspecific: %s\n", \
246 __FILE__, __LINE__, strerror(p_ret)); \
251#define STARPU_PTHREAD_GETSPECIFIC(key) starpu_pthread_getspecific((key))
256#define _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) \
258 int p_ret = starpu_pthread_rwlock_init((rwlock), (attr)); \
259 if (STARPU_UNLIKELY(p_ret)) \
262 "%s:%d starpu_pthread_rwlock_init: %s\n", \
263 __FILE__, __LINE__, strerror(p_ret)); \
269#ifdef STARPU_PTHREAD_RWLOCK_INITIALIZER_ZERO
270#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) \
273 memset(rwlock, 0, sizeof(*rwlock)); \
275 _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr); \
278#define STARPU_PTHREAD_RWLOCK_INIT0(rwlock, attr) \
281 _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr); \
285#define STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr) _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
286#define STARPU_PTHREAD_RWLOCK_INIT0(rwlock, attr) _STARPU_PTHREAD_RWLOCK_INIT(rwlock, attr)
289#define STARPU_PTHREAD_RWLOCK_RDLOCK(rwlock) \
291 int p_ret = starpu_pthread_rwlock_rdlock(rwlock); \
292 if (STARPU_UNLIKELY(p_ret)) \
295 "%s:%d starpu_pthread_rwlock_rdlock: %s\n", \
296 __FILE__, __LINE__, strerror(p_ret)); \
302#define STARPU_PTHREAD_RWLOCK_TRYRDLOCK(rwlock) \
303 _starpu_pthread_rwlock_tryrdlock(rwlock, __FILE__, __LINE__)
304static STARPU_INLINE
int _starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock,
char *file,
int line)
310 "%s:%d starpu_pthread_rwlock_tryrdlock: %s\n",
311 file, line, strerror(p_ret));
317#define STARPU_PTHREAD_RWLOCK_WRLOCK(rwlock) \
319 int p_ret = starpu_pthread_rwlock_wrlock(rwlock); \
320 if (STARPU_UNLIKELY(p_ret)) \
323 "%s:%d starpu_pthread_rwlock_wrlock: %s\n", \
324 __FILE__, __LINE__, strerror(p_ret)); \
330#define STARPU_PTHREAD_RWLOCK_TRYWRLOCK(rwlock) \
331 _starpu_pthread_rwlock_trywrlock(rwlock, __FILE__, __LINE__)
332static STARPU_INLINE
int _starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock,
char *file,
int line)
338 "%s:%d starpu_pthread_rwlock_trywrlock: %s\n",
339 file, line, strerror(p_ret));
345#define STARPU_PTHREAD_RWLOCK_UNLOCK(rwlock) \
347 int p_ret = starpu_pthread_rwlock_unlock(rwlock); \
348 if (STARPU_UNLIKELY(p_ret)) \
351 "%s:%d starpu_pthread_rwlock_unlock: %s\n", \
352 __FILE__, __LINE__, strerror(p_ret)); \
358#define STARPU_PTHREAD_RWLOCK_DESTROY(rwlock) \
360 int p_ret = starpu_pthread_rwlock_destroy(rwlock); \
361 if (STARPU_UNLIKELY(p_ret)) \
364 "%s:%d starpu_pthread_rwlock_destroy: %s\n", \
365 __FILE__, __LINE__, strerror(p_ret)); \
374#define _STARPU_PTHREAD_COND_INIT(cond, attr) \
376 int p_ret = starpu_pthread_cond_init((cond), (attr)); \
377 if (STARPU_UNLIKELY(p_ret)) \
380 "%s:%d starpu_pthread_cond_init: %s\n", \
381 __FILE__, __LINE__, strerror(p_ret)); \
387#ifdef STARPU_PTHREAD_COND_INITIALIZER_ZERO
388#define STARPU_PTHREAD_COND_INIT(cond, attr) \
391 memset(cond, 0, sizeof(*cond)); \
393 _STARPU_PTHREAD_COND_INIT(cond, attr); \
396#define STARPU_PTHREAD_COND_INIT0(cond, attr) \
399 _STARPU_PTHREAD_COND_INIT(cond, attr); \
403#define STARPU_PTHREAD_COND_INIT(cond, attr) _STARPU_PTHREAD_COND_INIT(cond, attr)
404#define STARPU_PTHREAD_COND_INIT0(cond, attr) _STARPU_PTHREAD_COND_INIT(cond, attr)
407#define STARPU_PTHREAD_COND_DESTROY(cond) \
409 int p_ret = starpu_pthread_cond_destroy(cond); \
410 if (STARPU_UNLIKELY(p_ret)) \
413 "%s:%d starpu_pthread_cond_destroy: %s\n", \
414 __FILE__, __LINE__, strerror(p_ret)); \
420#define STARPU_PTHREAD_COND_SIGNAL(cond) \
422 int p_ret = starpu_pthread_cond_signal(cond); \
423 if (STARPU_UNLIKELY(p_ret)) \
426 "%s:%d starpu_pthread_cond_signal: %s\n", \
427 __FILE__, __LINE__, strerror(p_ret)); \
433#define STARPU_PTHREAD_COND_BROADCAST(cond) \
435 int p_ret = starpu_pthread_cond_broadcast(cond); \
436 if (STARPU_UNLIKELY(p_ret)) \
439 "%s:%d starpu_pthread_cond_broadcast: %s\n", \
440 __FILE__, __LINE__, strerror(p_ret)); \
446#define STARPU_PTHREAD_COND_WAIT(cond, mutex) \
448 int p_ret = starpu_pthread_cond_wait((cond), (mutex)); \
449 if (STARPU_UNLIKELY(p_ret)) \
452 "%s:%d starpu_pthread_cond_wait: %s\n", \
453 __FILE__, __LINE__, strerror(p_ret)); \
461#define STARPU_PTHREAD_COND_TIMEDWAIT(cond, mutex, abstime) \
462 _starpu_pthread_cond_timedwait(cond, mutex, abstime, __FILE__, __LINE__)
463static 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 "%s:%d starpu_pthread_cond_timedwait: %s\n",
470 file, line, strerror(p_ret));
481#define STARPU_PTHREAD_BARRIER_INIT(barrier, attr, count) \
483 int p_ret = starpu_pthread_barrier_init((barrier), (attr), (count)); \
484 if (STARPU_UNLIKELY(p_ret)) \
487 "%s:%d starpu_pthread_barrier_init: %s\n", \
488 __FILE__, __LINE__, strerror(p_ret)); \
494#define STARPU_PTHREAD_BARRIER_DESTROY(barrier) \
496 int p_ret = starpu_pthread_barrier_destroy((barrier)); \
497 if (STARPU_UNLIKELY(p_ret)) \
500 "%s:%d starpu_pthread_barrier_destroy: %s\n", \
501 __FILE__, __LINE__, strerror(p_ret)); \
507#define STARPU_PTHREAD_BARRIER_WAIT(barrier) \
509 int p_ret = starpu_pthread_barrier_wait((barrier)); \
510 if (STARPU_UNLIKELY(!((p_ret == 0) || (p_ret == STARPU_PTHREAD_BARRIER_SERIAL_THREAD)))) \
513 "%s:%d starpu_pthread_barrier_wait: %s\n", \
514 __FILE__, __LINE__, strerror(p_ret)); \
int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime)