From 8af9fa08dc994c8a43ea7dc6254e10f5a0987fb7 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Tue, 16 Aug 2011 18:00:18 -0400 Subject: - when building for 389-ds, use Slapi_RWLocks if they appear to be available (the rest of #730394/#730403) --- configure.ac | 13 +++++++++++-- slapi-nis.spec | 4 ++++ src/wrap.c | 23 ++++++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index d91b16f..1981777 100644 --- a/configure.ac +++ b/configure.ac @@ -94,10 +94,17 @@ dirsrv) if test x$ac_cv_header_dirsrv_slapi_plugin_h = xno ; then AC_ERROR([ not found]) fi + AC_CHECK_DECLS(slapi_new_rwlock,,, + [AC_INCLUDES_DEFAULT + #include ]) CFLAGS="$saved_CFLAGS" LIBS="$saved_LIBS" thread_api=NSPR - thread_lock_api=POSIX + if test x$ac_cv_decl_slapi_new_rwlock = xyes ; then + thread_lock_api=SLAPI + else + thread_lock_api=POSIX + fi ;; *) RUNTIME_CFLAGS= @@ -126,7 +133,9 @@ else AC_MSG_ERROR([no threading API selected]) fi -if test $thread_lock_api = NSPR ; then +if test $thread_lock_api = SLAPI ; then + AC_DEFINE(USE_SLAPI_LOCKS,1,[Define to use SLAPI read/write locks.]) +elif test $thread_lock_api = NSPR ; then AC_DEFINE(USE_NSPR_LOCKS,1,[Define to use NSPR read/write locks.]) elif test $thread_lock_api = POSIX ; then AC_DEFINE(USE_PTHREAD_LOCKS,1,[Define to use POSIX read/write locks.]) diff --git a/slapi-nis.spec b/slapi-nis.spec index 746f8b8..a8f57f6 100644 --- a/slapi-nis.spec +++ b/slapi-nis.spec @@ -64,6 +64,10 @@ rm -rf $RPM_BUILD_ROOT %{_sbindir}/nisserver-plugin-defs %changelog +* Tue Aug 16 2011 Nalin Dahyabhai - 0.27-1 +- when building for 389-ds, use Slapi_RWLocks if they appear to be available + (the rest of #730394/#730403) + * Fri Aug 12 2011 Nalin Dahyabhai - 0.26-1 - when building for 389-ds, use libpthread's read-write locks instead of NSPR's (part of #730394/#730403) diff --git a/src/wrap.c b/src/wrap.c index ce15c8a..8ba56d2 100644 --- a/src/wrap.c +++ b/src/wrap.c @@ -68,7 +68,9 @@ struct wrapped_thread { }; struct wrapped_rwlock { -#if defined(USE_PTHREAD_LOCKS) +#if defined(USE_SLAPI_LOCKS) + Slapi_RWLock *rwlock; +#elif defined(USE_PTHREAD_LOCKS) pthread_rwlock_t rwlock; #elif defined(USE_NSPR_LOCKS) PRRWLock *rwlock; @@ -175,6 +177,13 @@ wrap_new_rwlock(void) if (rwlock == NULL) { return NULL; } +#ifdef USE_SLAPI_LOCKS + rwlock->rwlock = slapi_new_rwlock(); + if (rwlock->rwlock == NULL) { + free(rwlock); + return NULL; + } +#endif #ifdef USE_PTHREAD_LOCKS if (pthread_rwlock_init(&rwlock->rwlock, NULL) != 0) { free(rwlock); @@ -195,6 +204,9 @@ wrap_new_rwlock(void) void wrap_free_rwlock(struct wrapped_rwlock *rwlock) { +#ifdef USE_SLAPI_LOCKS + slapi_destroy_rwlock(rwlock->rwlock); +#endif #ifdef USE_PTHREAD_LOCKS pthread_rwlock_destroy(&rwlock->rwlock); #endif @@ -207,6 +219,9 @@ wrap_free_rwlock(struct wrapped_rwlock *rwlock) void wrap_rwlock_rdlock(struct wrapped_rwlock *rwlock) { +#ifdef USE_SLAPI_LOCKS + slapi_rwlock_rdlock(rwlock->rwlock); +#endif #ifdef USE_PTHREAD_LOCKS pthread_rwlock_rdlock(&rwlock->rwlock); #endif @@ -218,6 +233,9 @@ wrap_rwlock_rdlock(struct wrapped_rwlock *rwlock) void wrap_rwlock_wrlock(struct wrapped_rwlock *rwlock) { +#ifdef USE_SLAPI_LOCKS + slapi_rwlock_wrlock(rwlock->rwlock); +#endif #ifdef USE_PTHREAD_LOCKS pthread_rwlock_wrlock(&rwlock->rwlock); #endif @@ -229,6 +247,9 @@ wrap_rwlock_wrlock(struct wrapped_rwlock *rwlock) void wrap_rwlock_unlock(struct wrapped_rwlock *rwlock) { +#ifdef USE_SLAPI_LOCKS + slapi_rwlock_unlock(rwlock->rwlock); +#endif #ifdef USE_PTHREAD_LOCKS pthread_rwlock_unlock(&rwlock->rwlock); #endif -- cgit