]> git.sur5r.net Git - openldap/blob - libraries/libldap_r/thr_posix.c
9bd2b0a29cdb846288407427ba8453441bc5f688
[openldap] / libraries / libldap_r / thr_posix.c
1 /* thrposix.c - wrapper around posix and posixish thread implementations.
2  */
3
4 #include "portable.h"
5 #include "ldap_pvt_thread.h"
6
7 #if defined( HAVE_PTHREADS )
8
9 int 
10 ldap_pvt_thread_create( ldap_pvt_thread_t * thread, 
11                         ldap_pvt_thread_attr_t *attr,
12                        void *(*start_routine)( void *), void *arg)
13 {
14 #if !defined( HAVE_PTHREADS_D4 )
15         /* This is a standard pthreads implementation. */
16         return pthread_create( thread, attr, start_routine, arg );
17 #else
18         /* This is a draft 4 or earlier implementation. */
19         return pthread_create( thread, *attr, start_routine, arg );
20 #endif  
21 }
22
23 void 
24 ldap_pvt_thread_exit( void *retval )
25 {
26         pthread_exit( retval );
27 }
28
29 int 
30 ldap_pvt_thread_join( ldap_pvt_thread_t thread, void **thread_return )
31 {
32 #if !defined( HAVE_PTHREADS_FINAL )
33         void *dummy;
34         if (thread_return==NULL)
35           thread_return=&dummy;
36 #endif  
37         return pthread_join( thread, thread_return );
38 }
39
40 int 
41 ldap_pvt_thread_kill( ldap_pvt_thread_t thread, int signo )
42 {
43 #ifdef HAVE_PTHREAD_KILL
44         return pthread_kill( thread, signo );
45 #else
46         /* pthread package with DCE */
47         if (kill( getpid(), sig )<0)
48                 return errno;
49         return 0;
50 #endif
51 }
52
53 int 
54 ldap_pvt_thread_yield( void )
55 {
56 #ifdef HAVE_SCHED_YIELD
57         return sched_yield();
58 #else
59         return pthread_yield();
60 #endif   
61 }
62
63 int 
64 ldap_pvt_thread_attr_init( ldap_pvt_thread_attr_t *attr )
65 {
66 #if defined( HAVE_PTHREAD_ATTR_INIT )
67         return pthread_attr_init( attr );
68 #elif defined( HAVE_PTHREAD_ATTR_CREATE )
69         return pthread_attr_create( attr );
70 #else
71         No way to init attr, so cause an error.
72 #endif
73 }
74         
75 int 
76 ldap_pvt_thread_attr_destroy( ldap_pvt_thread_attr_t *attr )
77 {
78 #if defined( HAVE_PTHREAD_ATTR_DESTROY )
79         return pthread_attr_destroy( attr );
80 #elif defined( HAVE_PTHREAD_ATTR_DELETE )
81         return pthread_attr_delete( attr );
82 #else
83         No way to destroy attr, so cause an error.
84 #endif
85 }
86
87 int 
88 ldap_pvt_thread_attr_setdetachstate( ldap_pvt_thread_attr_t *attr, int dstate )
89 {
90 #if defined( HAVE_PTHREAD_ATTR_SETDETACHSTATE )
91         return pthread_attr_setdetachstate( attr, dstate );
92 #elif defined( HAVE_PTHREAD_ATTR_SETDETACH_NP )
93         return pthread_attr_setdetach_np( attr, dstate );
94 #else
95         No way to set state, so cause an error.
96 #endif
97 }
98
99 int 
100 ldap_pvt_thread_cond_init( ldap_pvt_thread_cond_t *cond, 
101                           ldap_pvt_thread_condattr_t *attr )
102 {
103 #if defined( HAVE_PTHREADS_D4 )
104         return pthread_cond_init( cond, 
105                                  attr ? attr : pthread_condattr_default );
106 #else   
107         return pthread_cond_init( cond, attr );
108 #endif  
109 }
110         
111 int 
112 ldap_pvt_thread_cond_signal( ldap_pvt_thread_cond_t *cond )
113 {
114         return pthread_cond_signal( cond );
115 }
116
117 int
118 ldap_pvt_thread_cond_broadcast( ldap_pvt_thread_cond_t *cond )
119 {
120         return pthread_cond_broadcast( cond );
121 }
122
123 int 
124 ldap_pvt_thread_cond_wait( ldap_pvt_thread_cond_t *cond, 
125                       ldap_pvt_thread_mutex_t *mutex )
126 {
127         return pthread_cond_wait( cond, mutex );
128 }
129
130 int 
131 ldap_pvt_thread_mutex_init( ldap_pvt_thread_mutex_t *mutex,
132                            ldap_pvt_thread_mutexattr_t *attr )
133 {
134 #if defined( HAVE_PTHREADS_D4 )
135         return pthread_mutex_init( mutex,
136                                   attr ? attr : pthread_mutexattr_default );
137 #else       
138         return pthread_mutex_init( mutex, attr );
139 #endif      
140 }
141
142 int 
143 ldap_pvt_thread_mutex_destroy( ldap_pvt_thread_mutex_t *mutex )
144 {
145         return pthread_mutex_destroy( mutex );
146 }
147
148 int 
149 ldap_pvt_thread_mutex_lock( ldap_pvt_thread_mutex_t *mutex )
150 {
151         return pthread_mutex_lock( mutex );
152 }
153
154 int 
155 ldap_pvt_thread_mutex_unlock( ldap_pvt_thread_mutex_t *mutex )
156 {
157         return pthread_mutex_unlock( mutex );
158 }
159
160 #endif /* HAVE_PTHREADS */
161