]> git.sur5r.net Git - openldap/blob - libraries/libldap_r/thr_posix.c
Reworked thread code to better support thread-library specific
[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         return 0;
45 }
46
47 #ifdef HAVE_PTHREAD_SETCONCURRENCY
48 int
49 ldap_pvt_thread_set_concurrency(int n)
50 {
51 #ifdef HAVE_PTHREAD_SETCONCURRENCY
52         return pthread_setconcurrency( n );
53 #elif HAVE_THR_SETCONCURRENCY
54         return pthread_setconcurrency( n );
55 #else
56         return 0;
57 #endif
58 }
59 #endif
60
61 #ifdef HAVE_PTHREAD_GETCONCURRENCY
62 int
63 ldap_pvt_thread_get_concurrency(void)
64 {
65 #ifdef HAVE_PTHREAD_GETCONCURRENCY
66         return pthread_getconcurrency();
67 #elif HAVE_THR_GETCONCURRENCY
68         return pthread_getconcurrency();
69 #else
70         return 0;
71 #endif
72 }
73 #endif
74
75 int 
76 ldap_pvt_thread_create( ldap_pvt_thread_t * thread,
77         int detach,
78         void *(*start_routine)( void * ),
79         void *arg)
80 {
81         int rtn;
82 #if defined(HAVE_PTHREADS_FINAL) && defined(PTHREAD_CREATE_UNDETACHED)
83         pthread_attr_t attr;
84
85         pthread_attr_init(&attr);
86         if (!detach)
87                 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_UNDETACHED);
88
89         rtn = pthread_create( thread, &attr, start_routine, arg );
90 #else
91         rtn = pthread_create( thread, LDAP_INT_THREAD_ATTR_DEFAULT,
92                                   start_routine, arg );
93 #endif
94
95         if( detach ) {
96 #ifdef HAVE_PTHREADS_FINAL
97                 pthread_detach( *thread );
98 #else
99                 pthread_detach( thread );
100 #endif
101         }
102         return rtn;
103 }
104
105 void 
106 ldap_pvt_thread_exit( void *retval )
107 {
108         pthread_exit( retval );
109 }
110
111 int 
112 ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
113 {
114 #if !defined( HAVE_PTHREADS_FINAL )
115         void *dummy;
116         if (thread_return==NULL)
117           thread_return=&dummy;
118 #endif  
119         return pthread_join( thread, thread_return );
120 }
121
122 int 
123 ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo )
124 {
125 #ifdef HAVE_PTHREAD_KILL
126         return pthread_kill( thread, signo );
127 #else
128         /* pthread package with DCE */
129         if (kill( getpid(), signo )<0)
130                 return errno;
131         return 0;
132 #endif
133 }
134
135 int 
136 ldap_pvt_thread_yield( void )
137 {
138 #ifdef _POSIX_THREAD_IS_GNU_PTH
139         sched_yield();
140         return 0;
141
142 #elif HAVE_SCHED_YIELD
143         return sched_yield();
144
145 #elif HAVE_PTHREAD_YIELD
146         pthread_yield();
147         return 0;
148
149 #elif HAVE_THR_YIELD
150         return thr_yield();
151
152 #else
153         return 0;
154 #endif   
155 }
156
157 int 
158 ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond )
159 {
160         return pthread_cond_init( cond, LDAP_INT_THREAD_CONDATTR_DEFAULT );
161 }
162
163 int 
164 ldap_pvt_thread_cond_destroy( ldap_pvt_thread_cond_t *cond )
165 {
166         return pthread_cond_destroy( cond );
167 }
168         
169 int 
170 ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond )
171 {
172         return pthread_cond_signal( cond );
173 }
174
175 int
176 ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond )
177 {
178         return pthread_cond_broadcast( cond );
179 }
180
181 int 
182 ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, 
183                       ldap_pvt_thread_mutex_t *mutex )
184 {
185         return pthread_cond_wait( cond, mutex );
186 }
187
188 int 
189 ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex )
190 {
191         return pthread_mutex_init( mutex, LDAP_INT_THREAD_MUTEXATTR_DEFAULT );
192 }
193
194 int 
195 ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
196 {
197         return pthread_mutex_destroy( mutex );
198 }
199
200 int 
201 ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex )
202 {
203         return pthread_mutex_lock( mutex );
204 }
205
206 int 
207 ldap_pvt_thread_mutex_trylock( ldap_pvt_thread_mutex_t *mutex )
208 {
209         return pthread_mutex_trylock( mutex );
210 }
211
212 int 
213 ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex )
214 {
215         return pthread_mutex_unlock( mutex );
216 }
217
218 #ifdef LDAP_THREAD_HAVE_RDWR
219 #ifdef HAVE_PTHREAD_RWLOCK_DESTROY
220 int 
221 ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
222 {
223         return pthread_rwlock_init( rw, NULL );
224 }
225
226 int 
227 ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw )
228 {
229         return pthread_rwlock_destroy( rw );
230 }
231
232 int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rw )
233 {
234         return pthread_rwlock_rdlock( rw );
235 }
236
237 int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rw )
238 {
239         return pthread_rwlock_tryrdlock( rw );
240 }
241
242 int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rw )
243 {
244         return pthread_rwlock_unlock( rw );
245 }
246
247 int ldap_pvt_thread_rdwr_wlock( ldap_pvt_thread_rdwr_t *rw )
248 {
249         return pthread_rwlock_wrlock( rw );
250 }
251
252 int ldap_pvt_thread_rdwr_wtrylock( ldap_pvt_thread_rdwr_t *rw )
253 {
254         return pthread_rwlock_trywrlock( rw );
255 }
256
257 int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rw )
258 {
259         return pthread_rwlock_unlock( rw );
260 }
261
262 #endif /* HAVE_PTHREAD_RDLOCK_DESTROY */
263 #endif /* LDAP_THREAD_HAVE_RDWR */
264 #endif /* HAVE_PTHREADS */
265