]> git.sur5r.net Git - openldap/blob - libraries/libldap_r/thr_posix.c
Move stacksize setting outside of detach #ifdef
[openldap] / libraries / libldap_r / thr_posix.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-2000 The OpenLDAP Foundation, Redwood City, California, USA
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms are permitted only
7  * as authorized by the OpenLDAP Public License.  A copy of this
8  * license is available at http://www.OpenLDAP.org/license.html or
9  * in file LICENSE in the top-level directory of the distribution.
10  */
11
12 /* thr_posix.c - wrapper around posix and posixish thread implementations.
13  */
14
15 #include "portable.h"
16
17 #if defined( HAVE_PTHREADS )
18
19 #include <ac/errno.h>
20
21 #include "ldap_pvt_thread.h"
22
23
24 #if HAVE_PTHREADS_D4
25 #  define LDAP_INT_THREAD_ATTR_DEFAULT          pthread_attr_default
26 #  define LDAP_INT_THREAD_CONDATTR_DEFAULT      pthread_condattr_default
27 #  define LDAP_INT_THREAD_MUTEXATTR_DEFAULT     pthread_mutexattr_default
28 #else
29 #  define LDAP_INT_THREAD_ATTR_DEFAULT          NULL
30 #  define LDAP_INT_THREAD_CONDATTR_DEFAULT      NULL
31 #  define LDAP_INT_THREAD_MUTEXATTR_DEFAULT     NULL
32 #endif
33
34
35 int
36 ldap_int_thread_initialize( void )
37 {
38         return 0;
39 }
40
41 int
42 ldap_int_thread_destroy( void )
43 {
44 #ifdef HAVE_PTHREAD_KILL_OTHER_THREADS_NP
45         /* LinuxThreads: kill clones */
46         pthread_kill_other_threads_np();
47 #endif
48         return 0;
49 }
50
51 #ifdef LDAP_THREAD_HAVE_SETCONCURRENCY
52 int
53 ldap_pvt_thread_set_concurrency(int n)
54 {
55 #ifdef HAVE_PTHREAD_SETCONCURRENCY
56         return pthread_setconcurrency( n );
57 #elif HAVE_THR_SETCONCURRENCY
58         return thr_setconcurrency( n );
59 #else
60         return 0;
61 #endif
62 }
63 #endif
64
65 #ifdef LDAP_THREAD_HAVE_GETCONCURRENCY
66 int
67 ldap_pvt_thread_get_concurrency(void)
68 {
69 #ifdef HAVE_PTHREAD_GETCONCURRENCY
70         return pthread_getconcurrency();
71 #elif HAVE_THR_GETCONCURRENCY
72         return thr_getconcurrency();
73 #else
74         return 0;
75 #endif
76 }
77 #endif
78
79 int 
80 ldap_pvt_thread_create( ldap_pvt_thread_t * thread,
81         int detach,
82         void *(*start_routine)( void * ),
83         void *arg)
84 {
85         int rtn;
86 #if defined( HAVE_PTHREADS_FINAL )
87         pthread_attr_t attr;
88         pthread_attr_init(&attr);
89
90 #if defined( PTHREAD_CREATE_JOINABLE ) || defined( PTHREAD_UNDETACHED )
91         if (!detach) {
92 #if defined( PTHREAD_CREATE_JOINABLE )
93                 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
94 #else
95                 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);
96 #endif
97 #ifdef PTHREAD_CREATE_DETACHED
98         } else {
99                 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
100 #endif
101         }
102 #endif
103
104 #if defined(LDAP_PVT_THREAD_STACK_SIZE) && LDAP_PVT_THREAD_STACK_SIZE > 0
105         /* this should be tunable */
106         pthread_attr_setstacksize( &attr, LDAP_PVT_THREAD_STACK_SIZE );
107 #endif
108
109         rtn = pthread_create( thread, &attr, start_routine, arg );
110
111 #if !defined( PTHREAD_CREATE_JOINABLE ) && !defined( PTHREAD_UNDETACHED )
112         if( detach ) {
113                 (void) pthread_detach( *thread );
114         }
115 #endif
116
117 #else
118         rtn = pthread_create( thread, LDAP_INT_THREAD_ATTR_DEFAULT,
119                 start_routine, arg );
120
121         if( detach ) {
122                 pthread_detach( thread );
123         }
124 #endif
125
126         return rtn;
127 }
128
129 void 
130 ldap_pvt_thread_exit( void *retval )
131 {
132         pthread_exit( retval );
133 }
134
135 int 
136 ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
137 {
138 #if !defined( HAVE_PTHREADS_FINAL )
139         void *dummy;
140         if (thread_return==NULL)
141           thread_return=&dummy;
142 #endif  
143         return pthread_join( thread, thread_return );
144 }
145
146 int 
147 ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo )
148 {
149 #ifdef HAVE_PTHREAD_KILL
150         return pthread_kill( thread, signo );
151 #else
152         /* pthread package with DCE */
153         if (kill( getpid(), signo )<0)
154                 return errno;
155         return 0;
156 #endif
157 }
158
159 int 
160 ldap_pvt_thread_yield( void )
161 {
162 #ifdef _POSIX_THREAD_IS_GNU_PTH
163         sched_yield();
164         return 0;
165
166 #elif HAVE_SCHED_YIELD
167         return sched_yield();
168
169 #elif HAVE_PTHREAD_YIELD
170         pthread_yield();
171         return 0;
172
173 #elif HAVE_THR_YIELD
174         return thr_yield();
175
176 #else
177         return 0;
178 #endif   
179 }
180
181 int 
182 ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond )
183 {
184         return pthread_cond_init( cond, LDAP_INT_THREAD_CONDATTR_DEFAULT );
185 }
186
187 int 
188 ldap_pvt_thread_cond_destroy( ldap_pvt_thread_cond_t *cond )
189 {
190         return pthread_cond_destroy( cond );
191 }
192         
193 int 
194 ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond )
195 {
196         return pthread_cond_signal( cond );
197 }
198
199 int
200 ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond )
201 {
202         return pthread_cond_broadcast( cond );
203 }
204
205 int 
206 ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, 
207                       ldap_pvt_thread_mutex_t *mutex )
208 {
209         return pthread_cond_wait( cond, mutex );
210 }
211
212 int 
213 ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex )
214 {
215         return pthread_mutex_init( mutex, LDAP_INT_THREAD_MUTEXATTR_DEFAULT );
216 }
217
218 int 
219 ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
220 {
221         return pthread_mutex_destroy( mutex );
222 }
223
224 int 
225 ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex )
226 {
227         return pthread_mutex_lock( mutex );
228 }
229
230 int 
231 ldap_pvt_thread_mutex_trylock( ldap_pvt_thread_mutex_t *mutex )
232 {
233         return pthread_mutex_trylock( mutex );
234 }
235
236 int 
237 ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex )
238 {
239         return pthread_mutex_unlock( mutex );
240 }
241
242 #ifdef LDAP_THREAD_HAVE_RDWR
243 #ifdef HAVE_PTHREAD_RWLOCK_DESTROY
244 int 
245 ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
246 {
247         return pthread_rwlock_init( rw, NULL );
248 }
249
250 int 
251 ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw )
252 {
253         return pthread_rwlock_destroy( rw );
254 }
255
256 int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rw )
257 {
258         return pthread_rwlock_rdlock( rw );
259 }
260
261 int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rw )
262 {
263         return pthread_rwlock_tryrdlock( rw );
264 }
265
266 int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rw )
267 {
268         return pthread_rwlock_unlock( rw );
269 }
270
271 int ldap_pvt_thread_rdwr_wlock( ldap_pvt_thread_rdwr_t *rw )
272 {
273         return pthread_rwlock_wrlock( rw );
274 }
275
276 int ldap_pvt_thread_rdwr_wtrylock( ldap_pvt_thread_rdwr_t *rw )
277 {
278         return pthread_rwlock_trywrlock( rw );
279 }
280
281 int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rw )
282 {
283         return pthread_rwlock_unlock( rw );
284 }
285
286 #endif /* HAVE_PTHREAD_RDLOCK_DESTROY */
287 #endif /* LDAP_THREAD_HAVE_RDWR */
288 #endif /* HAVE_PTHREADS */
289