xref: /netbsd-src/external/bsd/openldap/dist/libraries/libldap/thr_posix.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1*549b59edSchristos /*	$NetBSD: thr_posix.c,v 1.2 2021/08/14 16:14:56 christos Exp $	*/
2e670fd5cSchristos 
3e670fd5cSchristos /* thr_posix.c - wrapper around posix and posixish thread implementations.  */
4e670fd5cSchristos /* $OpenLDAP$ */
5e670fd5cSchristos /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6e670fd5cSchristos  *
7e670fd5cSchristos  * Copyright 1998-2021 The OpenLDAP Foundation.
8e670fd5cSchristos  * All rights reserved.
9e670fd5cSchristos  *
10e670fd5cSchristos  * Redistribution and use in source and binary forms, with or without
11e670fd5cSchristos  * modification, are permitted only as authorized by the OpenLDAP
12e670fd5cSchristos  * Public License.
13e670fd5cSchristos  *
14e670fd5cSchristos  * A copy of this license is available in file LICENSE in the
15e670fd5cSchristos  * top-level directory of the distribution or, alternatively, at
16e670fd5cSchristos  * <http://www.OpenLDAP.org/license.html>.
17e670fd5cSchristos  */
18e670fd5cSchristos 
19e670fd5cSchristos 
20e670fd5cSchristos #include <sys/cdefs.h>
21*549b59edSchristos __RCSID("$NetBSD: thr_posix.c,v 1.2 2021/08/14 16:14:56 christos Exp $");
22e670fd5cSchristos 
23e670fd5cSchristos #include "portable.h"
24e670fd5cSchristos 
25e670fd5cSchristos #if defined( HAVE_PTHREADS )
26e670fd5cSchristos 
27e670fd5cSchristos #ifdef __GLIBC__
28e670fd5cSchristos #undef _FEATURES_H
29e670fd5cSchristos #define _XOPEN_SOURCE 500		/* For pthread_setconcurrency() on glibc */
30e670fd5cSchristos #endif
31e670fd5cSchristos 
32e670fd5cSchristos #include <ac/errno.h>
33e670fd5cSchristos 
34e670fd5cSchristos #ifdef REPLACE_BROKEN_YIELD
35e670fd5cSchristos #ifndef HAVE_NANOSLEEP
36e670fd5cSchristos #include <ac/socket.h>
37e670fd5cSchristos #endif
38e670fd5cSchristos #include <ac/time.h>
39e670fd5cSchristos #endif
40e670fd5cSchristos 
41e670fd5cSchristos #include "ldap_pvt_thread.h" /* Get the thread interface */
42e670fd5cSchristos #define LDAP_THREAD_IMPLEMENTATION
43e670fd5cSchristos #define LDAP_THREAD_RDWR_IMPLEMENTATION
44e670fd5cSchristos #include "ldap_thr_debug.h"	 /* May rename the symbols defined below */
45e670fd5cSchristos #include <signal.h>			 /* For pthread_kill() */
46e670fd5cSchristos 
47e670fd5cSchristos extern int ldap_int_stackguard;
48e670fd5cSchristos 
49e670fd5cSchristos #if HAVE_PTHREADS < 6
50e670fd5cSchristos #  define LDAP_INT_THREAD_ATTR_DEFAULT		pthread_attr_default
51e670fd5cSchristos #  define LDAP_INT_THREAD_CONDATTR_DEFAULT	pthread_condattr_default
52e670fd5cSchristos #  define LDAP_INT_THREAD_MUTEXATTR_DEFAULT	pthread_mutexattr_default
53e670fd5cSchristos #else
54e670fd5cSchristos #  define LDAP_INT_THREAD_ATTR_DEFAULT		NULL
55e670fd5cSchristos #  define LDAP_INT_THREAD_CONDATTR_DEFAULT	NULL
56e670fd5cSchristos #  define LDAP_INT_THREAD_MUTEXATTR_DEFAULT NULL
57e670fd5cSchristos #endif
58e670fd5cSchristos 
59e670fd5cSchristos #ifdef LDAP_THREAD_DEBUG
60e670fd5cSchristos #  if defined LDAP_INT_THREAD_MUTEXATTR	/* May be defined in CPPFLAGS */
61e670fd5cSchristos #  elif defined HAVE_PTHREAD_KILL_OTHER_THREADS_NP
62e670fd5cSchristos 	 /* LinuxThreads hack */
63e670fd5cSchristos #    define LDAP_INT_THREAD_MUTEXATTR	PTHREAD_MUTEX_ERRORCHECK_NP
64e670fd5cSchristos #  else
65e670fd5cSchristos #    define LDAP_INT_THREAD_MUTEXATTR	PTHREAD_MUTEX_ERRORCHECK
66e670fd5cSchristos #  endif
67e670fd5cSchristos static pthread_mutexattr_t mutex_attr;
68e670fd5cSchristos #  undef  LDAP_INT_THREAD_MUTEXATTR_DEFAULT
69e670fd5cSchristos #  define LDAP_INT_THREAD_MUTEXATTR_DEFAULT &mutex_attr
70e670fd5cSchristos #endif
71e670fd5cSchristos 
72e670fd5cSchristos static pthread_mutexattr_t mutex_attr_recursive;
73e670fd5cSchristos 
74e670fd5cSchristos #if HAVE_PTHREADS < 7
75e670fd5cSchristos #define ERRVAL(val)	((val) < 0 ? errno : 0)
76e670fd5cSchristos #else
77e670fd5cSchristos #define ERRVAL(val)	(val)
78e670fd5cSchristos #endif
79e670fd5cSchristos 
80e670fd5cSchristos int
ldap_int_thread_initialize(void)81e670fd5cSchristos ldap_int_thread_initialize( void )
82e670fd5cSchristos {
83e670fd5cSchristos #ifdef LDAP_INT_THREAD_MUTEXATTR
84e670fd5cSchristos 	pthread_mutexattr_init( &mutex_attr );
85e670fd5cSchristos 	pthread_mutexattr_settype( &mutex_attr, LDAP_INT_THREAD_MUTEXATTR );
86e670fd5cSchristos #endif
87e670fd5cSchristos 	if (pthread_mutexattr_init(&mutex_attr_recursive))
88e670fd5cSchristos 		return -1;
89e670fd5cSchristos 	if (pthread_mutexattr_settype(&mutex_attr_recursive, PTHREAD_MUTEX_RECURSIVE))
90e670fd5cSchristos 		return -1;
91e670fd5cSchristos 	return 0;
92e670fd5cSchristos }
93e670fd5cSchristos 
94e670fd5cSchristos int
ldap_int_thread_destroy(void)95e670fd5cSchristos ldap_int_thread_destroy( void )
96e670fd5cSchristos {
97e670fd5cSchristos #ifdef HAVE_PTHREAD_KILL_OTHER_THREADS_NP
98e670fd5cSchristos 	/* LinuxThreads: kill clones */
99e670fd5cSchristos 	pthread_kill_other_threads_np();
100e670fd5cSchristos #endif
101e670fd5cSchristos #ifdef LDAP_INT_THREAD_MUTEXATTR
102e670fd5cSchristos 	pthread_mutexattr_destroy( &mutex_attr );
103e670fd5cSchristos #endif
104e670fd5cSchristos 	pthread_mutexattr_destroy( &mutex_attr_recursive );
105e670fd5cSchristos 	return 0;
106e670fd5cSchristos }
107e670fd5cSchristos 
108e670fd5cSchristos #ifdef LDAP_THREAD_HAVE_SETCONCURRENCY
109e670fd5cSchristos int
ldap_pvt_thread_set_concurrency(int n)110e670fd5cSchristos ldap_pvt_thread_set_concurrency(int n)
111e670fd5cSchristos {
112e670fd5cSchristos #ifdef HAVE_PTHREAD_SETCONCURRENCY
113e670fd5cSchristos 	return pthread_setconcurrency( n );
114e670fd5cSchristos #elif defined(HAVE_THR_SETCONCURRENCY)
115e670fd5cSchristos 	return thr_setconcurrency( n );
116e670fd5cSchristos #else
117e670fd5cSchristos 	return 0;
118e670fd5cSchristos #endif
119e670fd5cSchristos }
120e670fd5cSchristos #endif
121e670fd5cSchristos 
122e670fd5cSchristos #ifdef LDAP_THREAD_HAVE_GETCONCURRENCY
123e670fd5cSchristos int
ldap_pvt_thread_get_concurrency(void)124e670fd5cSchristos ldap_pvt_thread_get_concurrency(void)
125e670fd5cSchristos {
126e670fd5cSchristos #ifdef HAVE_PTHREAD_GETCONCURRENCY
127e670fd5cSchristos 	return pthread_getconcurrency();
128e670fd5cSchristos #elif defined(HAVE_THR_GETCONCURRENCY)
129e670fd5cSchristos 	return thr_getconcurrency();
130e670fd5cSchristos #else
131e670fd5cSchristos 	return 0;
132e670fd5cSchristos #endif
133e670fd5cSchristos }
134e670fd5cSchristos #endif
135e670fd5cSchristos 
136e670fd5cSchristos /* detachstate appeared in Draft 6, but without manifest constants.
137e670fd5cSchristos  * in Draft 7 they were called PTHREAD_CREATE_UNDETACHED and ...DETACHED.
138e670fd5cSchristos  * in Draft 8 on, ...UNDETACHED became ...JOINABLE.
139e670fd5cSchristos  */
140e670fd5cSchristos #ifndef PTHREAD_CREATE_JOINABLE
141e670fd5cSchristos #ifdef PTHREAD_CREATE_UNDETACHED
142e670fd5cSchristos #define	PTHREAD_CREATE_JOINABLE	PTHREAD_CREATE_UNDETACHED
143e670fd5cSchristos #else
144e670fd5cSchristos #define	PTHREAD_CREATE_JOINABLE	0
145e670fd5cSchristos #endif
146e670fd5cSchristos #endif
147e670fd5cSchristos 
148e670fd5cSchristos #ifndef PTHREAD_CREATE_DETACHED
149e670fd5cSchristos #define	PTHREAD_CREATE_DETACHED	1
150e670fd5cSchristos #endif
151e670fd5cSchristos 
152e670fd5cSchristos int
ldap_pvt_thread_create(ldap_pvt_thread_t * thread,int detach,void * (* start_routine)(void *),void * arg)153e670fd5cSchristos ldap_pvt_thread_create( ldap_pvt_thread_t * thread,
154e670fd5cSchristos 	int detach,
155e670fd5cSchristos 	void *(*start_routine)( void * ),
156e670fd5cSchristos 	void *arg)
157e670fd5cSchristos {
158e670fd5cSchristos 	int rtn;
159e670fd5cSchristos 	pthread_attr_t attr;
160e670fd5cSchristos 
161e670fd5cSchristos /* Always create the thread attrs, so we can set stacksize if we need to */
162e670fd5cSchristos #if HAVE_PTHREADS > 5
163e670fd5cSchristos 	pthread_attr_init(&attr);
164e670fd5cSchristos #else
165e670fd5cSchristos 	pthread_attr_create(&attr);
166e670fd5cSchristos #endif
167e670fd5cSchristos 
168e670fd5cSchristos #ifdef LDAP_PVT_THREAD_SET_STACK_SIZE
169e670fd5cSchristos 	/* this should be tunable */
170e670fd5cSchristos 	pthread_attr_setstacksize( &attr, LDAP_PVT_THREAD_STACK_SIZE );
171e670fd5cSchristos 	if ( ldap_int_stackguard )
172e670fd5cSchristos 		pthread_attr_setguardsize( &attr, LDAP_PVT_THREAD_STACK_SIZE );
173e670fd5cSchristos #endif
174e670fd5cSchristos 
175e670fd5cSchristos #if HAVE_PTHREADS > 5
176e670fd5cSchristos 	detach = detach ? PTHREAD_CREATE_DETACHED : PTHREAD_CREATE_JOINABLE;
177e670fd5cSchristos #if HAVE_PTHREADS == 6
178e670fd5cSchristos 	pthread_attr_setdetachstate(&attr, &detach);
179e670fd5cSchristos #else
180e670fd5cSchristos 	pthread_attr_setdetachstate(&attr, detach);
181e670fd5cSchristos #endif
182e670fd5cSchristos #endif
183e670fd5cSchristos 
184e670fd5cSchristos #if HAVE_PTHREADS < 5
185e670fd5cSchristos 	rtn = pthread_create( thread, attr, start_routine, arg );
186e670fd5cSchristos #else
187e670fd5cSchristos 	rtn = pthread_create( thread, &attr, start_routine, arg );
188e670fd5cSchristos #endif
189e670fd5cSchristos 
190e670fd5cSchristos #if HAVE_PTHREADS > 5
191e670fd5cSchristos 	pthread_attr_destroy(&attr);
192e670fd5cSchristos #else
193e670fd5cSchristos 	pthread_attr_delete(&attr);
194e670fd5cSchristos 	if( detach ) {
195e670fd5cSchristos 		pthread_detach( thread );
196e670fd5cSchristos 	}
197e670fd5cSchristos #endif
198e670fd5cSchristos 
199e670fd5cSchristos #if HAVE_PTHREADS < 7
200e670fd5cSchristos 	if ( rtn < 0 ) rtn = errno;
201e670fd5cSchristos #endif
202e670fd5cSchristos 	return rtn;
203e670fd5cSchristos }
204e670fd5cSchristos 
205e670fd5cSchristos void
ldap_pvt_thread_exit(void * retval)206e670fd5cSchristos ldap_pvt_thread_exit( void *retval )
207e670fd5cSchristos {
208e670fd5cSchristos 	pthread_exit( retval );
209e670fd5cSchristos }
210e670fd5cSchristos 
211e670fd5cSchristos int
ldap_pvt_thread_join(ldap_pvt_thread_t thread,void ** thread_return)212e670fd5cSchristos ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
213e670fd5cSchristos {
214e670fd5cSchristos #if HAVE_PTHREADS < 7
215e670fd5cSchristos 	void *dummy;
216e670fd5cSchristos 	if (thread_return==NULL)
217e670fd5cSchristos 	  thread_return=&dummy;
218e670fd5cSchristos #endif
219e670fd5cSchristos 	return ERRVAL( pthread_join( thread, thread_return ) );
220e670fd5cSchristos }
221e670fd5cSchristos 
222e670fd5cSchristos int
ldap_pvt_thread_kill(ldap_pvt_thread_t thread,int signo)223e670fd5cSchristos ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo )
224e670fd5cSchristos {
225e670fd5cSchristos #if defined(HAVE_PTHREAD_KILL) && HAVE_PTHREADS > 4
226e670fd5cSchristos 	/* MacOS 10.1 is detected as v10 but has no pthread_kill() */
227e670fd5cSchristos 	return ERRVAL( pthread_kill( thread, signo ) );
228e670fd5cSchristos #else
229e670fd5cSchristos 	/* pthread package with DCE */
230e670fd5cSchristos 	if (kill( getpid(), signo )<0)
231e670fd5cSchristos 		return errno;
232e670fd5cSchristos 	return 0;
233e670fd5cSchristos #endif
234e670fd5cSchristos }
235e670fd5cSchristos 
236e670fd5cSchristos int
ldap_pvt_thread_yield(void)237e670fd5cSchristos ldap_pvt_thread_yield( void )
238e670fd5cSchristos {
239e670fd5cSchristos #ifdef REPLACE_BROKEN_YIELD
240e670fd5cSchristos #ifdef HAVE_NANOSLEEP
241e670fd5cSchristos 	struct timespec t = { 0, 0 };
242e670fd5cSchristos 	nanosleep(&t, NULL);
243e670fd5cSchristos #else
244e670fd5cSchristos 	struct timeval tv = {0,0};
245e670fd5cSchristos 	select( 0, NULL, NULL, NULL, &tv );
246e670fd5cSchristos #endif
247e670fd5cSchristos 	return 0;
248e670fd5cSchristos 
249e670fd5cSchristos #elif defined(HAVE_THR_YIELD)
250e670fd5cSchristos 	thr_yield();
251e670fd5cSchristos 	return 0;
252e670fd5cSchristos 
253e670fd5cSchristos #elif HAVE_PTHREADS == 10
254e670fd5cSchristos 	return sched_yield();
255e670fd5cSchristos 
256e670fd5cSchristos #elif defined(_POSIX_THREAD_IS_GNU_PTH)
257e670fd5cSchristos 	sched_yield();
258e670fd5cSchristos 	return 0;
259e670fd5cSchristos 
260e670fd5cSchristos #elif HAVE_PTHREADS == 6
261e670fd5cSchristos 	pthread_yield(NULL);
262e670fd5cSchristos 	return 0;
263e670fd5cSchristos 
264e670fd5cSchristos #else
265e670fd5cSchristos 	pthread_yield();
266e670fd5cSchristos 	return 0;
267e670fd5cSchristos #endif
268e670fd5cSchristos }
269e670fd5cSchristos 
270e670fd5cSchristos int
ldap_pvt_thread_cond_init(ldap_pvt_thread_cond_t * cond)271e670fd5cSchristos ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond )
272e670fd5cSchristos {
273e670fd5cSchristos 	return ERRVAL( pthread_cond_init(
274e670fd5cSchristos 		cond, LDAP_INT_THREAD_CONDATTR_DEFAULT ) );
275e670fd5cSchristos }
276e670fd5cSchristos 
277e670fd5cSchristos int
ldap_pvt_thread_cond_destroy(ldap_pvt_thread_cond_t * cond)278e670fd5cSchristos ldap_pvt_thread_cond_destroy( ldap_pvt_thread_cond_t *cond )
279e670fd5cSchristos {
280e670fd5cSchristos 	return ERRVAL( pthread_cond_destroy( cond ) );
281e670fd5cSchristos }
282e670fd5cSchristos 
283e670fd5cSchristos int
ldap_pvt_thread_cond_signal(ldap_pvt_thread_cond_t * cond)284e670fd5cSchristos ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond )
285e670fd5cSchristos {
286e670fd5cSchristos 	return ERRVAL( pthread_cond_signal( cond ) );
287e670fd5cSchristos }
288e670fd5cSchristos 
289e670fd5cSchristos int
ldap_pvt_thread_cond_broadcast(ldap_pvt_thread_cond_t * cond)290e670fd5cSchristos ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond )
291e670fd5cSchristos {
292e670fd5cSchristos 	return ERRVAL( pthread_cond_broadcast( cond ) );
293e670fd5cSchristos }
294e670fd5cSchristos 
295e670fd5cSchristos int
ldap_pvt_thread_cond_wait(ldap_pvt_thread_cond_t * cond,ldap_pvt_thread_mutex_t * mutex)296e670fd5cSchristos ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond,
297e670fd5cSchristos 		      ldap_pvt_thread_mutex_t *mutex )
298e670fd5cSchristos {
299e670fd5cSchristos 	return ERRVAL( pthread_cond_wait( cond, mutex ) );
300e670fd5cSchristos }
301e670fd5cSchristos 
302e670fd5cSchristos int
ldap_pvt_thread_mutex_init(ldap_pvt_thread_mutex_t * mutex)303e670fd5cSchristos ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex )
304e670fd5cSchristos {
305e670fd5cSchristos 	return ERRVAL( pthread_mutex_init(
306e670fd5cSchristos 		mutex, LDAP_INT_THREAD_MUTEXATTR_DEFAULT ) );
307e670fd5cSchristos }
308e670fd5cSchristos 
309e670fd5cSchristos int
ldap_pvt_thread_mutex_destroy(ldap_pvt_thread_mutex_t * mutex)310e670fd5cSchristos ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
311e670fd5cSchristos {
312e670fd5cSchristos 	return ERRVAL( pthread_mutex_destroy( mutex ) );
313e670fd5cSchristos }
314e670fd5cSchristos 
315e670fd5cSchristos int
ldap_pvt_thread_mutex_lock(ldap_pvt_thread_mutex_t * mutex)316e670fd5cSchristos ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex )
317e670fd5cSchristos {
318e670fd5cSchristos 	return ERRVAL( pthread_mutex_lock( mutex ) );
319e670fd5cSchristos }
320e670fd5cSchristos 
321e670fd5cSchristos int
ldap_pvt_thread_mutex_trylock(ldap_pvt_thread_mutex_t * mutex)322e670fd5cSchristos ldap_pvt_thread_mutex_trylock( ldap_pvt_thread_mutex_t *mutex )
323e670fd5cSchristos {
324e670fd5cSchristos 	return ERRVAL( pthread_mutex_trylock( mutex ) );
325e670fd5cSchristos }
326e670fd5cSchristos 
327e670fd5cSchristos int
ldap_pvt_thread_mutex_unlock(ldap_pvt_thread_mutex_t * mutex)328e670fd5cSchristos ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex )
329e670fd5cSchristos {
330e670fd5cSchristos 	return ERRVAL( pthread_mutex_unlock( mutex ) );
331e670fd5cSchristos }
332e670fd5cSchristos 
333e670fd5cSchristos int
ldap_pvt_thread_mutex_recursive_init(ldap_pvt_thread_mutex_t * mutex)334e670fd5cSchristos ldap_pvt_thread_mutex_recursive_init( ldap_pvt_thread_mutex_t *mutex )
335e670fd5cSchristos {
336e670fd5cSchristos 	return ERRVAL( pthread_mutex_init( mutex, &mutex_attr_recursive ) );
337e670fd5cSchristos }
338e670fd5cSchristos 
ldap_pvt_thread_self(void)339e670fd5cSchristos ldap_pvt_thread_t ldap_pvt_thread_self( void )
340e670fd5cSchristos {
341e670fd5cSchristos 	return pthread_self();
342e670fd5cSchristos }
343e670fd5cSchristos 
344e670fd5cSchristos int
ldap_pvt_thread_key_create(ldap_pvt_thread_key_t * key)345e670fd5cSchristos ldap_pvt_thread_key_create( ldap_pvt_thread_key_t *key )
346e670fd5cSchristos {
347e670fd5cSchristos 	return pthread_key_create( key, NULL );
348e670fd5cSchristos }
349e670fd5cSchristos 
350e670fd5cSchristos int
ldap_pvt_thread_key_destroy(ldap_pvt_thread_key_t key)351e670fd5cSchristos ldap_pvt_thread_key_destroy( ldap_pvt_thread_key_t key )
352e670fd5cSchristos {
353e670fd5cSchristos 	return pthread_key_delete( key );
354e670fd5cSchristos }
355e670fd5cSchristos 
356e670fd5cSchristos int
ldap_pvt_thread_key_setdata(ldap_pvt_thread_key_t key,void * data)357e670fd5cSchristos ldap_pvt_thread_key_setdata( ldap_pvt_thread_key_t key, void *data )
358e670fd5cSchristos {
359e670fd5cSchristos 	return pthread_setspecific( key, data );
360e670fd5cSchristos }
361e670fd5cSchristos 
362e670fd5cSchristos int
ldap_pvt_thread_key_getdata(ldap_pvt_thread_key_t key,void ** data)363e670fd5cSchristos ldap_pvt_thread_key_getdata( ldap_pvt_thread_key_t key, void **data )
364e670fd5cSchristos {
365e670fd5cSchristos 	*data = pthread_getspecific( key );
366e670fd5cSchristos 	return 0;
367e670fd5cSchristos }
368e670fd5cSchristos 
369e670fd5cSchristos #ifdef LDAP_THREAD_HAVE_RDWR
370e670fd5cSchristos #ifdef HAVE_PTHREAD_RWLOCK_DESTROY
371e670fd5cSchristos int
ldap_pvt_thread_rdwr_init(ldap_pvt_thread_rdwr_t * rw)372e670fd5cSchristos ldap_pvt_thread_rdwr_init( ldap_pvt_thread_rdwr_t *rw )
373e670fd5cSchristos {
374e670fd5cSchristos 	return ERRVAL( pthread_rwlock_init( rw, NULL ) );
375e670fd5cSchristos }
376e670fd5cSchristos 
377e670fd5cSchristos int
ldap_pvt_thread_rdwr_destroy(ldap_pvt_thread_rdwr_t * rw)378e670fd5cSchristos ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw )
379e670fd5cSchristos {
380e670fd5cSchristos 	return ERRVAL( pthread_rwlock_destroy( rw ) );
381e670fd5cSchristos }
382e670fd5cSchristos 
ldap_pvt_thread_rdwr_rlock(ldap_pvt_thread_rdwr_t * rw)383e670fd5cSchristos int ldap_pvt_thread_rdwr_rlock( ldap_pvt_thread_rdwr_t *rw )
384e670fd5cSchristos {
385e670fd5cSchristos 	return ERRVAL( pthread_rwlock_rdlock( rw ) );
386e670fd5cSchristos }
387e670fd5cSchristos 
ldap_pvt_thread_rdwr_rtrylock(ldap_pvt_thread_rdwr_t * rw)388e670fd5cSchristos int ldap_pvt_thread_rdwr_rtrylock( ldap_pvt_thread_rdwr_t *rw )
389e670fd5cSchristos {
390e670fd5cSchristos 	return ERRVAL( pthread_rwlock_tryrdlock( rw ) );
391e670fd5cSchristos }
392e670fd5cSchristos 
ldap_pvt_thread_rdwr_runlock(ldap_pvt_thread_rdwr_t * rw)393e670fd5cSchristos int ldap_pvt_thread_rdwr_runlock( ldap_pvt_thread_rdwr_t *rw )
394e670fd5cSchristos {
395e670fd5cSchristos 	return ERRVAL( pthread_rwlock_unlock( rw ) );
396e670fd5cSchristos }
397e670fd5cSchristos 
ldap_pvt_thread_rdwr_wlock(ldap_pvt_thread_rdwr_t * rw)398e670fd5cSchristos int ldap_pvt_thread_rdwr_wlock( ldap_pvt_thread_rdwr_t *rw )
399e670fd5cSchristos {
400e670fd5cSchristos 	return ERRVAL( pthread_rwlock_wrlock( rw ) );
401e670fd5cSchristos }
402e670fd5cSchristos 
ldap_pvt_thread_rdwr_wtrylock(ldap_pvt_thread_rdwr_t * rw)403e670fd5cSchristos int ldap_pvt_thread_rdwr_wtrylock( ldap_pvt_thread_rdwr_t *rw )
404e670fd5cSchristos {
405e670fd5cSchristos 	return ERRVAL( pthread_rwlock_trywrlock( rw ) );
406e670fd5cSchristos }
407e670fd5cSchristos 
ldap_pvt_thread_rdwr_wunlock(ldap_pvt_thread_rdwr_t * rw)408e670fd5cSchristos int ldap_pvt_thread_rdwr_wunlock( ldap_pvt_thread_rdwr_t *rw )
409e670fd5cSchristos {
410e670fd5cSchristos 	return ERRVAL( pthread_rwlock_unlock( rw ) );
411e670fd5cSchristos }
412e670fd5cSchristos 
413e670fd5cSchristos #endif /* HAVE_PTHREAD_RWLOCK_DESTROY */
414e670fd5cSchristos #endif /* LDAP_THREAD_HAVE_RDWR */
415e670fd5cSchristos #endif /* HAVE_PTHREADS */
416e670fd5cSchristos 
417