]> git.sur5r.net Git - openldap/blob - libraries/libldap_r/thr_posix.c
fix various memory leaks
[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         pthread_attr_destroy(&attr);
117
118 #else
119         rtn = pthread_create( thread, LDAP_INT_THREAD_ATTR_DEFAULT,
120                 start_routine, arg );
121
122         if( detach ) {
123                 pthread_detach( thread );
124         }
125 #endif
126
127         return rtn;
128 }
129
130 void 
131 ldap_pvt_thread_exit( void *retval )
132 {
133         pthread_exit( retval );
134 }
135
136 int 
137 ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
138 {
139 #if !defined( HAVE_PTHREADS_FINAL )
140         void *dummy;
141         if (thread_return==NULL)
142           thread_return=&dummy;
143 #endif  
144         return pthread_join( thread, thread_return );
145 }
146
147 int 
148 ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo )
149 {
150 #ifdef HAVE_PTHREAD_KILL
151         return pthread_kill( thread, signo );
152 #else
153         /* pthread package with DCE */
154         if (kill( getpid(), signo )<0)
155                 return errno;
156         return 0;
157 #endif
158 }
159
160 int 
161 ldap_pvt_thread_yield( void )
162 {
163 #ifdef _POSIX_THREAD_IS_GNU_PTH
164         sched_yield();
165         return 0;
166
167 #elif HAVE_SCHED_YIELD
168         return sched_yield();
169
170 #elif HAVE_PTHREAD_YIELD
171         pthread_yield();
172         return 0;
173
174 #elif HAVE_THR_YIELD
175         return thr_yield();
176
177 #else
178         return 0;
179 #endif   
180 }
181
182 int 
183 ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond )
184 {
185         return pthread_cond_init( cond, LDAP_INT_THREAD_CONDATTR_DEFAULT );
186 }
187
188 int 
189 ldap_pvt_thread_cond_destroy( ldap_pvt_thread_cond_t *cond )
190 {
191         return pthread_cond_destroy( cond );
192 }
193         
194 int 
195 ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond )
196 {
197         return pthread_cond_signal( cond );
198 }
199
200 int
201 ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond )
202 {
203         return pthread_cond_broadcast( cond );
204 }
205
206 int 
207 ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, 
208                       ldap_pvt_thread_mutex_t *mutex )
209 {
210         return pthread_cond_wait( cond, mutex );
211 }
212
213 int 
214 ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex )
215 {
216         return pthread_mutex_init( mutex, LDAP_INT_THREAD_MUTEXATTR_DEFAULT );
217 }
218
219 int 
220 ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
221 {
222         return pthread_mutex_destroy( mutex );
223 }
224
225 int 
226 ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex )
227 {
228         return pthread_mutex_lock( mutex );
229 }
230
231 int 
232 ldap_pvt_thread_mutex_trylock( ldap_pvt_thread_mutex_t *mutex )
233 {
234         return pthread_mutex_trylock( mutex );
235 }
236
237 int 
238 ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex )
239 {
240         return pthread_mutex_unlock( mutex );
241 }
242
243 #ifdef LDAP_THREAD_HAVE_RDWR
244 #ifdef HAVE_PTHREAD_RWLOCK_DESTROY
245 int 
246 ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
247 {
248         return pthread_rwlock_init( rw, NULL );
249 }
250
251 int 
252 ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw )
253 {
254         return pthread_rwlock_destroy( rw );
255 }
256
257 int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rw )
258 {
259         return pthread_rwlock_rdlock( rw );
260 }
261
262 int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rw )
263 {
264         return pthread_rwlock_tryrdlock( rw );
265 }
266
267 int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rw )
268 {
269         return pthread_rwlock_unlock( rw );
270 }
271
272 int ldap_pvt_thread_rdwr_wlock( ldap_pvt_thread_rdwr_t *rw )
273 {
274         return pthread_rwlock_wrlock( rw );
275 }
276
277 int ldap_pvt_thread_rdwr_wtrylock( ldap_pvt_thread_rdwr_t *rw )
278 {
279         return pthread_rwlock_trywrlock( rw );
280 }
281
282 int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rw )
283 {
284         return pthread_rwlock_unlock( rw );
285 }
286
287 #endif /* HAVE_PTHREAD_RDLOCK_DESTROY */
288 #endif /* LDAP_THREAD_HAVE_RDWR */
289 #endif /* HAVE_PTHREADS */
290