- separate which thread creation/manipulation/destruction API we use
from which rwlock creation/manipulation/destruction API we use
Nalin Dahyabhai
12 years ago
94 | 94 |
CFLAGS="$saved_CFLAGS"
|
95 | 95 |
LIBS="$saved_LIBS"
|
96 | 96 |
AC_DEFINE(USE_NSPR_THREADS,1,[Define to use NSPR threading functions.])
|
|
97 |
AC_DEFINE(USE_NSPR_LOCKS,1,[Define to use NSPR read/write locks.])
|
97 | 98 |
;;
|
98 | 99 |
*)
|
99 | 100 |
RUNTIME_CFLAGS=
|
|
105 | 106 |
AC_ERROR([<slapi-plugin.h> not found])
|
106 | 107 |
fi
|
107 | 108 |
AC_DEFINE(USE_PTHREADS,1,[Define to use POSIX threading functions.])
|
|
109 |
AC_DEFINE(USE_PTHREAD_LOCKS,1,[Define to use POSIX read/write locks.])
|
108 | 110 |
saved_LIBS="$LIBS"
|
109 | 111 |
LIBS=
|
110 | 112 |
AC_CHECK_FUNC(pthread_create,,AC_CHECK_LIB(pthread,pthread_create))
|
38 | 38 |
#include <slapi-plugin.h>
|
39 | 39 |
#endif
|
40 | 40 |
|
41 | |
#ifdef USE_PTHREADS
|
|
41 |
#if defined(USE_NSPR_THREADS) || defined(USE_NSPR_LOCKS)
|
|
42 |
#include <nspr.h>
|
|
43 |
#endif
|
|
44 |
|
|
45 |
#if defined(USE_PTHREADS) || defined(USE_PTHREAD_LOCKS)
|
42 | 46 |
#include <pthread.h>
|
43 | 47 |
#endif
|
44 | 48 |
|
|
63 | 67 |
};
|
64 | 68 |
|
65 | 69 |
struct wrapped_rwlock {
|
66 | |
#if defined(USE_PTHREADS)
|
|
70 |
#if defined(USE_PTHREAD_LOCKS)
|
67 | 71 |
pthread_rwlock_t rwlock;
|
68 | |
#elif defined(USE_NSPR_THREADS)
|
|
72 |
#elif defined(USE_NSPR_LOCKS)
|
69 | 73 |
PRRWLock *rwlock;
|
70 | 74 |
#else
|
71 | |
#error "Unknown threading model!"
|
|
75 |
#error "Unknown thread-safe locking model!"
|
72 | 76 |
#endif
|
73 | 77 |
};
|
74 | 78 |
|
|
170 | 174 |
if (rwlock == NULL) {
|
171 | 175 |
return NULL;
|
172 | 176 |
}
|
173 | |
#ifdef USE_PTHREADS
|
|
177 |
#ifdef USE_PTHREAD_LOCKS
|
174 | 178 |
if (pthread_rwlock_init(&rwlock->rwlock, NULL) != 0) {
|
175 | 179 |
free(rwlock);
|
176 | 180 |
return NULL;
|
177 | 181 |
}
|
178 | 182 |
#endif
|
179 | |
#ifdef USE_NSPR_THREADS
|
|
183 |
#ifdef USE_NSPR_LOCKS
|
180 | 184 |
rwlock->rwlock = PR_NewRWLock(PR_RWLOCK_RANK_NONE,
|
181 | 185 |
PACKAGE_NAME "-rw-lock");
|
182 | 186 |
if (rwlock->rwlock == NULL) {
|
|
190 | 194 |
void
|
191 | 195 |
wrap_free_rwlock(struct wrapped_rwlock *rwlock)
|
192 | 196 |
{
|
193 | |
#ifdef USE_PTHREADS
|
|
197 |
#ifdef USE_PTHREAD_LOCKS
|
194 | 198 |
pthread_rwlock_destroy(&rwlock->rwlock);
|
195 | 199 |
#endif
|
196 | |
#ifdef USE_NSPR_THREADS
|
|
200 |
#ifdef USE_NSPR_LOCKS
|
197 | 201 |
PR_DestroyRWLock(rwlock->rwlock);
|
198 | 202 |
#endif
|
199 | 203 |
free(rwlock);
|
|
202 | 206 |
void
|
203 | 207 |
wrap_rwlock_rdlock(struct wrapped_rwlock *rwlock)
|
204 | 208 |
{
|
205 | |
#ifdef USE_PTHREADS
|
|
209 |
#ifdef USE_PTHREAD_LOCKS
|
206 | 210 |
pthread_rwlock_rdlock(&rwlock->rwlock);
|
207 | 211 |
#endif
|
208 | |
#ifdef USE_NSPR_THREADS
|
|
212 |
#ifdef USE_NSPR_LOCKS
|
209 | 213 |
PR_RWLock_Rlock(rwlock->rwlock);
|
210 | 214 |
#endif
|
211 | 215 |
}
|
|
213 | 217 |
void
|
214 | 218 |
wrap_rwlock_wrlock(struct wrapped_rwlock *rwlock)
|
215 | 219 |
{
|
216 | |
#ifdef USE_PTHREADS
|
|
220 |
#ifdef USE_PTHREAD_LOCKS
|
217 | 221 |
pthread_rwlock_wrlock(&rwlock->rwlock);
|
218 | 222 |
#endif
|
219 | |
#ifdef USE_NSPR_THREADS
|
|
223 |
#ifdef USE_NSPR_LOCKS
|
220 | 224 |
PR_RWLock_Wlock(rwlock->rwlock);
|
221 | 225 |
#endif
|
222 | 226 |
}
|
|
224 | 228 |
void
|
225 | 229 |
wrap_rwlock_unlock(struct wrapped_rwlock *rwlock)
|
226 | 230 |
{
|
227 | |
#ifdef USE_PTHREADS
|
|
231 |
#ifdef USE_PTHREAD_LOCKS
|
228 | 232 |
pthread_rwlock_unlock(&rwlock->rwlock);
|
229 | 233 |
#endif
|
230 | |
#ifdef USE_NSPR_THREADS
|
|
234 |
#ifdef USE_NSPR_LOCKS
|
231 | 235 |
PR_RWLock_Unlock(rwlock->rwlock);
|
232 | 236 |
#endif
|
233 | 237 |
}
|