StarPU Handbook
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
starpu_thread.h
Go to the documentation of this file.
1 /* StarPU --- Runtime system for heterogeneous multicore architectures.
2  *
3  * Copyright (C) 2010, 2012-2014 Université de Bordeaux
4  * Copyright (C) 2010, 2011, 2012, 2013 Centre National de la Recherche Scientifique
5  *
6  * StarPU is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or (at
9  * your option) any later version.
10  *
11  * StarPU is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  *
15  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
16  */
17 
18 #ifndef __STARPU_THREAD_H__
19 #define __STARPU_THREAD_H__
20 
21 #include <starpu_config.h>
22 #ifdef STARPU_SIMGRID
23 #include <xbt/synchro_core.h>
24 #ifdef STARPU_HAVE_SIMGRID_MSG_H
25 #include <simgrid/msg.h>
26 #else
27 #include <msg/msg.h>
28 #endif
29 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU)
30 #include <pthread.h>
31 #endif
32 
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #endif
37 
38 /*
39  * Encapsulation of the pthread_create function.
40  */
41 
42 #ifdef STARPU_SIMGRID
43 
44 typedef int starpu_pthread_t;
45 typedef int starpu_pthread_attr_t;
46 
47 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);
48 int starpu_pthread_create(starpu_pthread_t *thread, const starpu_pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
49 int starpu_pthread_join(starpu_pthread_t thread, void **retval);
50 int starpu_pthread_attr_init(starpu_pthread_attr_t *attr);
51 int starpu_pthread_attr_destroy(starpu_pthread_attr_t *attr);
52 int starpu_pthread_attr_setdetachstate(starpu_pthread_attr_t *attr, int detachstate);
53 
54 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* STARPU_SIMGRID */
55 
56 typedef pthread_t starpu_pthread_t;
57 typedef pthread_attr_t starpu_pthread_attr_t;
58 
59 #define starpu_pthread_create pthread_create
60 #define starpu_pthread_create_on(name, thread, attr, routine, arg, where) starpu_pthread_create(thread, attr, routine, arg)
61 #define starpu_pthread_join pthread_join
62 #define starpu_pthread_attr_init pthread_attr_init
63 #define starpu_pthread_attr_destroy pthread_attr_destroy
64 #define starpu_pthread_attr_setdetachstate pthread_attr_setdetachstate
65 
66 #endif /* STARPU_SIMGRID, _MSC_VER */
67 
68 /*
69  * Encapsulation of the pthread_mutex_* functions.
70  */
71 
72 #ifdef STARPU_SIMGRID
73 typedef xbt_mutex_t starpu_pthread_mutex_t;
74 typedef int starpu_pthread_mutexattr_t;
75 
76 #define STARPU_PTHREAD_MUTEX_INITIALIZER NULL
77 
78 int starpu_pthread_mutex_init(starpu_pthread_mutex_t *mutex, const starpu_pthread_mutexattr_t *mutexattr);
79 int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex);
80 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex);
81 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex);
82 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex);
83 
84 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
85 
86 typedef pthread_mutex_t starpu_pthread_mutex_t;
87 typedef pthread_mutexattr_t starpu_pthread_mutexattr_t;
88 
89 #define starpu_pthread_mutex_init pthread_mutex_init
90 #define starpu_pthread_mutex_destroy pthread_mutex_destroy
91 #define starpu_pthread_mutex_lock pthread_mutex_lock
92 #define starpu_pthread_mutex_unlock pthread_mutex_unlock
93 #define starpu_pthread_mutex_trylock pthread_mutex_trylock
94 
95 #define STARPU_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
96 
97 #endif /* STARPU_SIMGRID, _MSC_VER */
98 
99 /*
100  * Encapsulation of the pthread_key_* functions.
101  */
102 #ifdef STARPU_SIMGRID
103 
104 typedef int starpu_pthread_key_t;
105 int starpu_pthread_key_create(starpu_pthread_key_t *key, void (*destr_function) (void *));
106 int starpu_pthread_key_delete(starpu_pthread_key_t key);
107 int starpu_pthread_setspecific(starpu_pthread_key_t key, const void *pointer);
108 void *starpu_pthread_getspecific(starpu_pthread_key_t key);
109 
110 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
111 
112 typedef pthread_key_t starpu_pthread_key_t;
113 
114 #define starpu_pthread_key_create pthread_key_create
115 #define starpu_pthread_key_delete pthread_key_delete
116 #define starpu_pthread_setspecific pthread_setspecific
117 #define starpu_pthread_getspecific pthread_getspecific
118 
119 #endif /* STARPU_SIMGRID, _MSC_VER */
120 
121 /*
122  * Encapsulation of the pthread_cond_* functions.
123  */
124 
125 #ifdef STARPU_SIMGRID
126 
127 typedef xbt_cond_t starpu_pthread_cond_t;
128 typedef int starpu_pthread_condattr_t;
129 #define STARPU_PTHREAD_COND_INITIALIZER NULL
130 
131 int starpu_pthread_cond_init(starpu_pthread_cond_t *cond, starpu_pthread_condattr_t *cond_attr);
132 int starpu_pthread_cond_signal(starpu_pthread_cond_t *cond);
133 int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond);
134 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex);
135 int starpu_pthread_cond_timedwait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex, const struct timespec *abstime);
136 int starpu_pthread_cond_destroy(starpu_pthread_cond_t *cond);
137 
138 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
139 
140 typedef pthread_cond_t starpu_pthread_cond_t;
141 typedef pthread_condattr_t starpu_pthread_condattr_t;
142 #define STARPU_PTHREAD_COND_INITIALIZER PTHREAD_COND_INITIALIZER
143 
144 #define starpu_pthread_cond_init pthread_cond_init
145 #define starpu_pthread_cond_signal pthread_cond_signal
146 #define starpu_pthread_cond_broadcast pthread_cond_broadcast
147 #define starpu_pthread_cond_wait pthread_cond_wait
148 #define starpu_pthread_cond_timedwait pthread_cond_timedwait
149 #define starpu_pthread_cond_destroy pthread_cond_destroy
150 
151 #endif /* STARPU_SIMGRID, _MSC_VER */
152 
153 /*
154  * Encapsulation of the pthread_rwlock_* functions.
155  */
156 
157 #ifdef STARPU_SIMGRID
158 
159 typedef xbt_mutex_t starpu_pthread_rwlock_t;
160 typedef int starpu_pthread_rwlockattr_t;
161 
162 int starpu_pthread_rwlock_init(starpu_pthread_rwlock_t *rwlock, const starpu_pthread_rwlockattr_t *attr);
163 int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock);
164 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock);
165 int starpu_pthread_rwlock_tryrdlock(starpu_pthread_rwlock_t *rwlock);
166 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock);
167 int starpu_pthread_rwlock_trywrlock(starpu_pthread_rwlock_t *rwlock);
168 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock);
169 
170 #elif !defined(_MSC_VER) || defined(BUILDING_STARPU) /* !STARPU_SIMGRID */
171 
172 typedef pthread_rwlock_t starpu_pthread_rwlock_t;
173 typedef pthread_rwlockattr_t starpu_pthread_rwlockattr_t;
174 
175 #define starpu_pthread_rwlock_init pthread_rwlock_init
176 #define starpu_pthread_rwlock_destroy pthread_rwlock_destroy
177 #define starpu_pthread_rwlock_rdlock pthread_rwlock_rdlock
178 #define starpu_pthread_rwlock_tryrdlock pthread_rwlock_tryrdlock
179 #define starpu_pthread_rwlock_wrlock pthread_rwlock_wrlock
180 #define starpu_pthread_rwlock_trywrlock pthread_rwlock_trywrlock
181 #define starpu_pthread_rwlock_unlock pthread_rwlock_unlock
182 
183 #endif /* STARPU_SIMGRID, _MSC_VER */
184 
185 /*
186  * Encapsulation of the pthread_barrier_* functions.
187  */
188 
189 #if defined(STARPU_SIMGRID) || (!defined(STARPU_HAVE_PTHREAD_BARRIER) && (!defined(_MSC_VER) || defined(BUILDING_STARPU)))
190 
191 typedef struct {
192  starpu_pthread_mutex_t mutex;
193  starpu_pthread_cond_t cond;
194  starpu_pthread_cond_t cond_destroy;
195  unsigned count;
196  unsigned done;
197  unsigned busy;
199 typedef int starpu_pthread_barrierattr_t;
200 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD -1
201 
202 int starpu_pthread_barrier_init(starpu_pthread_barrier_t *barrier, const starpu_pthread_barrierattr_t *attr, unsigned count);
203 int starpu_pthread_barrier_destroy(starpu_pthread_barrier_t *barrier);
204 int starpu_pthread_barrier_wait(starpu_pthread_barrier_t *barrier);
205 
206 #elif !defined(_MSC_VER) /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER */
207 
208 typedef pthread_barrier_t starpu_pthread_barrier_t;
209 typedef pthread_barrierattr_t starpu_pthread_barrierattr_t;
210 
211 #define starpu_pthread_barrier_init pthread_barrier_init
212 #define starpu_pthread_barrier_destroy pthread_barrier_destroy
213 #define starpu_pthread_barrier_wait pthread_barrier_wait
214 #define STARPU_PTHREAD_BARRIER_SERIAL_THREAD PTHREAD_BARRIER_SERIAL_THREAD
215 
216 #endif /* STARPU_SIMGRID, !STARPU_HAVE_PTHREAD_BARRIER, _MSC_VER */
217 
218 #if defined(_MSC_VER) && !defined(BUILDING_STARPU)
219 typedef void* starpu_pthread_rwlock_t;
220 typedef void* starpu_pthread_mutex_t;
221 typedef void* starpu_pthread_cond_t;
222 typedef void* starpu_pthread_barrier_t;
223 #endif /* _MSC_VER */
224 
225 #ifdef __cplusplus
226 }
227 #endif
228 
229 #endif /* __STARPU_THREAD_H__ */
230 
231