StarPU Handbook
starpu_thread.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010-2022 Université de Bordeaux, CNRS (LaBRI UMR 5800), Inria
4  *
5  * StarPU is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation; either version 2.1 of the License, or (at
8  * your option) any later version.
9  *
10  * StarPU is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
15  */
16 
17 // The documentation for this file is in doc/doxygen/chapters/api/threads.doxy
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 #include <pthread.h>
26 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H
27 #include <simgrid/mutex.h>
28 #include <simgrid/cond.h>
29 #elif defined(STARPU_HAVE_XBT_SYNCHRO_H)
30 #include <xbt/synchro.h>
31 #else
32 #include <xbt/synchro_core.h>
33 #endif
34 #ifdef STARPU_HAVE_SIMGRID_ACTOR_H
35 #include <simgrid/actor.h>
36 #endif
37 #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H
38 #include <simgrid/semaphore.h>
39 #endif
40 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H
41 #include <simgrid/mutex.h>
42 #endif
43 #ifdef STARPU_HAVE_SIMGRID_COND_H
44 #include <simgrid/cond.h>
45 #endif
46 #ifdef STARPU_HAVE_SIMGRID_BARRIER_H
47 #include <simgrid/barrier.h>
48 #endif
49 #ifdef STARPU_HAVE_SIMGRID_HOST_H
50 #include <simgrid/host.h>
51 #endif
52 
53 #ifdef STARPU_HAVE_SIMGRID_MSG_H
54 #include <simgrid/msg.h>
55 #elif defined(STARPU_HAVE_MSG_MSG_H)
56 #include <msg/msg.h>
57 #endif
58 
59 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU)
60 #include <pthread.h>
61 #include <semaphore.h>
62 #endif
63 #include <stdint.h>
64 
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68 
69 /*
70  * Encapsulation of the pthread_create function.
71  */
72 
73 #ifdef STARPU_SIMGRID
74 
75 #ifdef STARPU_HAVE_SIMGRID_ACTOR_H
76 typedef sg_actor_t starpu_pthread_t;
77 #else
78 typedef msg_process_t starpu_pthread_t;
79 #endif
80 typedef struct
81 {
82  size_t stacksize;
84 
85 #ifdef STARPU_HAVE_SIMGRID_ACTOR_H
86 typedef sg_host_t starpu_sg_host_t;
87 #else
88 typedef msg_host_t starpu_sg_host_t;
89 #endif
90 int starpu_pthread_equal(starpu_pthread_t t1, starpu_pthread_t t2);
91 starpu_pthread_t starpu_pthread_self(void);
92 int starpu_pthread_create_on(const char *name, starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg, starpu_sg_host_t host);
93 int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
94 starpu_pthread_t _starpu_simgrid_actor_create(const char *name, xbt_main_func_t code, starpu_sg_host_t host, int argc, char *argv[]);
95 int starpu_pthread_join(starpu_pthread_t thread, void **retval);
100 int starpu_pthread_attr_setstacksize(starpu_pthread_attr_t *attr, size_t stacksize);
101 
102 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* STARPU_SIMGRID */
103 
104 typedef pthread_t starpu_pthread_t;
105 typedef pthread_attr_t starpu_pthread_attr_t;
106 
107 #define starpu_pthread_equal pthread_equal
108 #define starpu_pthread_self pthread_self
109 #define starpu_pthread_create pthread_create
110 #define starpu_pthread_create_on(name, thread, attr, routine, arg, where) starpu_pthread_create(thread, attr, routine, arg)
111 #define starpu_pthread_join pthread_join
112 #define starpu_pthread_exit pthread_exit
113 #define starpu_pthread_attr_init pthread_attr_init
114 #define starpu_pthread_attr_destroy pthread_attr_destroy
115 #define starpu_pthread_attr_setdetachstate pthread_attr_setdetachstate
116 #define starpu_pthread_attr_setstacksize pthread_attr_setstacksize
117 
118 #endif /* STARPU_SIMGRID, _MSC_VER */
119 
120 #ifdef STARPU_HAVE_PTHREAD_SETNAME_NP
121 #ifdef STARPU_HAVE_DARWIN
122 #define starpu_pthread_setname(name) pthread_setname_np(name)
123 #else
124 #define starpu_pthread_setname(name) pthread_setname_np(pthread_self(), name)
125 #endif
126 #else
127 #define starpu_pthread_setname(name)
128 #endif
129 
130 /*
131  * Encapsulation of the pthread_mutex_* functions.
132  */
133 
134 #ifdef STARPU_SIMGRID
135 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H
136 typedef sg_mutex_t starpu_pthread_mutex_t;
137 #else
138 typedef xbt_mutex_t starpu_pthread_mutex_t;
139 #endif
140 typedef int starpu_pthread_mutexattr_t;
141 
142 #define STARPU_PTHREAD_MUTEX_INITIALIZER NULL
143 
144 int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr);
145 int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex);
146 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
147 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
148 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
149 int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type);
150 int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type);
151 int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr);
152 int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr);
153 
154 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
155 
156 typedef pthread_mutex_t starpu_pthread_mutex_t;
157 typedef pthread_mutexattr_t starpu_pthread_mutexattr_t;
158 
159 #define starpu_pthread_mutex_init pthread_mutex_init
160 #define starpu_pthread_mutex_destroy pthread_mutex_destroy
161 #define starpu_pthread_mutexattr_gettype pthread_mutexattr_gettype
162 #define starpu_pthread_mutexattr_settype pthread_mutexattr_settype
163 #define starpu_pthread_mutexattr_destroy pthread_mutexattr_destroy
164 #define starpu_pthread_mutexattr_init pthread_mutexattr_init
165 
166 #ifdef STARPU_FXT_LOCK_TRACES
167 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
168 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
169 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
170 #else
171 #define starpu_pthread_mutex_lock pthread_mutex_lock
172 #define starpu_pthread_mutex_unlock pthread_mutex_unlock
173 #define starpu_pthread_mutex_trylock pthread_mutex_trylock
174 #endif
175 
176 #define STARPU_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
177 
178 #endif /* STARPU_SIMGRID, _MSC_VER */
179 
180 #if !defined(_MSC_VER) || defined(BUILDING_STARPU)
181 int starpu_pthread_mutex_lock_sched(starpu_pthread_mutex_t *mutex);
182 int starpu_pthread_mutex_unlock_sched(starpu_pthread_mutex_t *mutex);
183 int starpu_pthread_mutex_trylock_sched(starpu_pthread_mutex_t *mutex);
184 void starpu_pthread_mutex_check_sched(starpu_pthread_mutex_t *mutex, char *file, int line);
185 #endif
186 
187 /*
188  * Encapsulation of the pthread_key_* functions.
189  */
190 #ifdef STARPU_SIMGRID
191 
192 typedef int starpu_pthread_key_t;
193 int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function)(void *));
194 int starpu_pthread_key_delete(starpu_pthread_key_t key);
195 int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer);
196 void *starpu_pthread_getspecific(starpu_pthread_key_t key);
197 
198 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
199 
200 typedef pthread_key_t starpu_pthread_key_t;
201 
202 #define starpu_pthread_key_create pthread_key_create
203 #define starpu_pthread_key_delete pthread_key_delete
204 #define starpu_pthread_setspecific pthread_setspecific
205 #define starpu_pthread_getspecific pthread_getspecific
206 
207 #endif /* STARPU_SIMGRID, _MSC_VER */
208 
209 /*
210  * Encapsulation of the pthread_cond_* functions.
211  */
212 
213 #ifdef STARPU_SIMGRID
214 
215 #ifdef STARPU_HAVE_SIMGRID_COND_H
216 typedef sg_cond_t starpu_pthread_cond_t;
217 #else
218 typedef xbt_cond_t starpu_pthread_cond_t;
219 #endif
220 typedef int starpu_pthread_condattr_t;
221 #define STARPU_PTHREAD_COND_INITIALIZER NULL
222 
223 int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr);
224 int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond);
225 int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond);
226 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
227 int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime);
228 int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond);
229 
230 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
231 
232 typedef pthread_cond_t starpu_pthread_cond_t;
233 typedef pthread_condattr_t starpu_pthread_condattr_t;
234 #define STARPU_PTHREAD_COND_INITIALIZER PTHREAD_COND_INITIALIZER
235 
236 #define starpu_pthread_cond_init pthread_cond_init
237 #define starpu_pthread_cond_signal pthread_cond_signal
238 #define starpu_pthread_cond_broadcast pthread_cond_broadcast
239 
240 #ifdef STARPU_FXT_LOCK_TRACES
241 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
242 #else
243 #define starpu_pthread_cond_wait pthread_cond_wait
244 #endif
245 
246 #define starpu_pthread_cond_timedwait pthread_cond_timedwait
247 #define starpu_pthread_cond_destroy pthread_cond_destroy
248 
249 #endif /* STARPU_SIMGRID, _MSC_VER */
250 
251 /*
252  * Encapsulation of the pthread_rwlock_* functions.
253  */
254 
255 #ifdef STARPU_SIMGRID
256 
257 #ifdef STARPU_HAVE_SIMGRID_MUTEX_H
258 typedef sg_mutex_t starpu_pthread_rwlock_t;
259 #else
260 typedef xbt_mutex_t starpu_pthread_rwlock_t;
261 #endif
262 typedef int starpu_pthread_rwlockattr_t;
263 #define STARPU_PTHREAD_RWLOCK_INITIALIZER NULL
264 
265 int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr);
266 int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock);
267 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
268 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
269 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
270 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
271 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
272 
273 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
274 
275 typedef pthread_rwlock_t starpu_pthread_rwlock_t;
276 typedef pthread_rwlockattr_t starpu_pthread_rwlockattr_t;
277 #define STARPU_PTHREAD_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER
278 
279 #define starpu_pthread_rwlock_init pthread_rwlock_init
280 #define starpu_pthread_rwlock_destroy pthread_rwlock_destroy
281 
282 #ifdef STARPU_FXT_LOCK_TRACES
283 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
284 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
285 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
286 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
287 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
288 #else
289 #define starpu_pthread_rwlock_rdlock pthread_rwlock_rdlock
290 #define starpu_pthread_rwlock_tryrdlock pthread_rwlock_tryrdlock
291 #define starpu_pthread_rwlock_wrlock pthread_rwlock_wrlock
292 #define starpu_pthread_rwlock_trywrlock pthread_rwlock_trywrlock
293 #define starpu_pthread_rwlock_unlock pthread_rwlock_unlock
294 #endif
295 
296 #endif /* STARPU_SIMGRID, _MSC_VER */
297 
298 /*
299  * Encapsulation of the pthread_barrier_* functions.
300  */
301 
302 #if defined(STARPU_SIMGRID) || (!defined(STARPU_HAVE_PTHREAD_BARRIER) && (!defined(_MSC_VER) || defined(BUILDING_STARPU)))
303 
304 #if defined(STARPU_SIMGRID) && (defined(STARPU_HAVE_SIMGRID_BARRIER_H) || defined(STARPU_SIMGRID_HAVE_XBT_BARRIER_INIT) || defined(xbt_barrier_init))
305 #ifdef STARPU_HAVE_SIMGRID_BARRIER_H
306 typedef sg_bar_t starpu_pthread_barrier_t;
307 #else
308 typedef xbt_bar_t starpu_pthread_barrier_t;
309 #endif
310 typedef int starpu_pthread_barrierattr_t;
311 #ifdef SG_BARRIER_SERIAL_THREAD
312 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD SG_BARRIER_SERIAL_THREAD
313 #else
314 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1
315 #endif
316 #else
317 typedef struct
318 {
319  starpu_pthread_mutex_t mutex;
320  starpu_pthread_cond_t cond;
321  starpu_pthread_cond_t cond_destroy;
322  unsigned count;
323  unsigned done;
324  unsigned busy;
326 typedef int starpu_pthread_barrierattr_t;
327 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1
328 #endif
329 
330 int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count);
333 
334 #elif !defined(_MSC_VER) /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER */
335 
336 typedef pthread_barrier_t starpu_pthread_barrier_t;
337 typedef pthread_barrierattr_t starpu_pthread_barrierattr_t;
338 
339 #define starpu_pthread_barrier_init pthread_barrier_init
340 #define starpu_pthread_barrier_destroy pthread_barrier_destroy
341 
342 #ifdef STARPU_FXT_LOCK_TRACES
344 #else
345 #define starpu_pthread_barrier_wait pthread_barrier_wait
346 #endif
347 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD PTHREAD_BARRIER_SERIAL_THREAD
348 
349 #endif /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER, _MSC_VER */
350 
351 /*
352  * Encapsulation of the pthread_spin_* functions.
353  */
354 
355 #if defined(STARPU_SIMGRID) || (defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)
356 
357 typedef struct
358 {
359 #ifdef STARPU_SIMGRID
360  int taken;
361 #elif defined(STARPU_LINUX_SYS) && defined(STARPU_HAVE_XCHG)
362  unsigned taken STARPU_ATTRIBUTE_ALIGNED(16);
363 #else /* we only have a trivial implementation yet ! */
364  uint32_t taken STARPU_ATTRIBUTE_ALIGNED(16);
365 #endif
367 
373 
374 #elif !defined(_MSC_VER) /* !(defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */
375 
376 typedef pthread_spinlock_t starpu_pthread_spinlock_t;
377 #define starpu_pthread_spin_init pthread_spin_init
378 #define starpu_pthread_spin_destroy pthread_spin_destroy
379 #define starpu_pthread_spin_lock pthread_spin_lock
380 #define starpu_pthread_spin_trylock pthread_spin_trylock
381 #define starpu_pthread_spin_unlock pthread_spin_unlock
382 
383 #endif /* !(defined(STARPU_SIMGRID) || !defined(STARPU_HAVE_PTHREAD_SPIN_LOCK)) */
384 
385 /*
386  * Other needed pthread definitions
387  */
388 
389 #if defined(_MSC_VER) && !defined(BUILDING_STARPU)
390 typedef void *starpu_pthread_rwlock_t;
391 typedef void *starpu_pthread_mutex_t;
392 typedef void *starpu_pthread_cond_t;
393 typedef void *starpu_pthread_barrier_t;
394 #endif /* _MSC_VER */
395 
396 /*
397  * Simgrid-specific register/wait synchronization
398  *
399  * Producers create a "queue" object, and when they have produced something,
400  * they call either queue_signal or queue_broadcast in order to wake either one
401  * or all consumers waiting on the queue.
402  *
403  * starpu_pthread_queue_init(&global_queue1->queue);
404  * while (1) {
405  * element = compute();
406  * push(element, global_queue1);
407  * starpu_pthread_queue_signal(global_queue1);
408  * }
409  * starpu_pthread_queue_destroy(&global_queue1->queue);
410  *
411  * Consumers create a "wait" object, then queue_register on as many queues they
412  * want. In their consumption loop, they wait_reset, then test for availibility
413  * on all producers, and if none was available, call wait_wait to actually wait
414  * for producers. On termination, consumers have to queue_unregister before
415  * destroying the "wait" object:
416  *
417  * starpu_pthread_wait_t wait;
418  *
419  * starpu_pthread_wait_init(&wait);
420  * starpu_pthread_queue_register(&wait, &global_queue1->queue);
421  * starpu_pthread_queue_register(&wait, &global_queue2->queue);
422  *
423  * while (1) {
424  * int sleep = 1;
425  * starpu_pthread_wait_reset(&wait);
426  * if (global_queue1->navailable)
427  * {
428  * work(global_queue1);
429  * sleep = 0;
430  * }
431  * if (global_queue2->navailable)
432  * {
433  * work(global_queue2);
434  * sleep = 0;
435  * }
436  * if (sleep)
437  * starpu_pthread_wait_wait(&wait);
438  * }
439  * starpu_pthread_queue_unregister(&wait, &global_queue1->queue);
440  * starpu_pthread_queue_unregister(&wait, &global_queue2->queue);
441  * starpu_pthread_wait_destroy(&wait);
442  */
443 
444 #ifdef STARPU_SIMGRID
445 typedef struct
446 {
447  starpu_pthread_mutex_t mutex;
448  starpu_pthread_cond_t cond;
449  unsigned block;
451 
452 typedef struct
453 {
454  starpu_pthread_mutex_t mutex;
455  starpu_pthread_wait_t **queue;
456  unsigned allocqueue;
457  unsigned nqueue;
459 
460 int starpu_pthread_queue_init(starpu_pthread_queue_t *q);
461 int starpu_pthread_queue_signal(starpu_pthread_queue_t *q);
462 int starpu_pthread_queue_broadcast(starpu_pthread_queue_t *q);
463 int starpu_pthread_queue_destroy(starpu_pthread_queue_t *q);
464 
465 int starpu_pthread_wait_init(starpu_pthread_wait_t *w);
466 int starpu_pthread_queue_register(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q);
467 int starpu_pthread_queue_unregister(starpu_pthread_wait_t *w, starpu_pthread_queue_t *q);
468 int starpu_pthread_wait_reset(starpu_pthread_wait_t *w);
469 int starpu_pthread_wait_wait(starpu_pthread_wait_t *w);
470 int starpu_pthread_wait_timedwait(starpu_pthread_wait_t *w, const struct timespec *abstime);
471 int starpu_pthread_wait_destroy(starpu_pthread_wait_t *w);
472 #endif
473 
474 /*
475  * Encapsulation of the semaphore functions.
476  */
477 
478 #ifdef STARPU_SIMGRID
479 
480 #ifdef STARPU_HAVE_SIMGRID_SEMAPHORE_H
481 typedef sg_sem_t starpu_sem_t;
482 #else
483 typedef msg_sem_t starpu_sem_t;
484 #endif
485 int starpu_sem_destroy(starpu_sem_t *sem);
486 int starpu_sem_getvalue(starpu_sem_t *sem, int *retval);
487 int starpu_sem_init(starpu_sem_t *sem, int pshared, unsigned value);
488 int starpu_sem_post(starpu_sem_t *sem);
489 int starpu_sem_trywait(starpu_sem_t *sem);
490 int starpu_sem_wait(starpu_sem_t *sem);
491 
492 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
493 
494 typedef sem_t starpu_sem_t;
495 #define starpu_sem_destroy sem_destroy
496 #define starpu_sem_getvalue sem_getvalue
497 #define starpu_sem_init sem_init
498 #define starpu_sem_post sem_post
499 int starpu_sem_trywait(starpu_sem_t *sem);
500 int starpu_sem_wait(starpu_sem_t *sem);
501 
502 #endif
503 
504 #ifdef __cplusplus
505 }
506 #endif
507 
508 #endif /* __STARPU_THREAD_H__ */
int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier)
int starpu_pthread_mutexattr_init(starpu_pthread_mutexattr_t *attr)
int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr)
void * starpu_pthread_getspecific(starpu_pthread_key_t key)
int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex)
int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_key_delete(starpu_pthread_key_t key)
int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr)
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_tryrdlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_key_create(starpu_pthread_key_t *key, void(*destr_function)(void *))
int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond)
int starpu_pthread_spin_init(starpu_pthread_spinlock_t *lock, int pshared)
int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate)
int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond)
int starpu_pthread_spin_destroy(starpu_pthread_spinlock_t *lock)
int starpu_pthread_exit(void *retval) STARPU_ATTRIBUTE_NORETURN
int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
int starpu_pthread_mutexattr_destroy(starpu_pthread_mutexattr_t *attr)
int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_join(starpu_pthread_t thread, void **retval)
int starpu_pthread_spin_lock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_spin_unlock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_mutexattr_gettype(const starpu_pthread_mutexattr_t *attr, int *type)
int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count)
int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier)
int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock)
int starpu_pthread_spin_trylock(starpu_pthread_spinlock_t *lock)
int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer)
int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr)
int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex)
int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex)
int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime)
int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond)
int starpu_pthread_mutexattr_settype(starpu_pthread_mutexattr_t *attr, int type)
int starpu_pthread_attr_init(starpu_pthread_attr_t *attr)
#define STARPU_ATTRIBUTE_NORETURN
Definition: starpu_util.h:93
#define STARPU_ATTRIBUTE_ALIGNED(size)
Definition: starpu_util.h:156
Definition: starpu_thread.h:81
Definition: starpu_thread.h:318
Definition: starpu_thread.h:453
Definition: starpu_thread.h:358
Definition: starpu_thread.h:446