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