]> git.sur5r.net Git - openldap/commitdiff
ITS#8339 Solaris 10/11 robust mutex fixes
authorHoward Chu <hyc@openldap.org>
Thu, 2 Jun 2016 20:01:27 +0000 (21:01 +0100)
committerHoward Chu <hyc@openldap.org>
Thu, 2 Jun 2016 20:01:27 +0000 (21:01 +0100)
Check for PTHREAD_MUTEX_ROBUST_NP definition (this doesn't work
on Linux/glibc because they used an enum). Zero out mutex before
initing.

libraries/liblmdb/mdb.c

index af4d73a73ad3e9a036784420e34179e89137223f..79a958b0ffcf7273d3044d9768d8e56ef63a128c 100644 (file)
@@ -304,7 +304,8 @@ union semun {
 # else
 #  define MDB_USE_ROBUST       1
 /* glibc < 2.12 only provided _np API */
-#  if defined(__GLIBC__) && GLIBC_VER < 0x02000c
+#  if (defined(__GLIBC__) && GLIBC_VER < 0x02000c) || \
+       (defined(PTHREAD_MUTEX_ROBUST_NP) && !defined(PTHREAD_MUTEX_ROBUST))
 #   define PTHREAD_MUTEX_ROBUST        PTHREAD_MUTEX_ROBUST_NP
 #   define pthread_mutexattr_setrobust(attr, flag)     pthread_mutexattr_setrobust_np(attr, flag)
 #   define pthread_mutex_consistent(mutex)     pthread_mutex_consistent_np(mutex)
@@ -4962,6 +4963,13 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
 #else  /* MDB_USE_POSIX_MUTEX: */
                pthread_mutexattr_t mattr;
 
+               /* Solaris needs this before initing a robust mutex.  Otherwise
+                * it may skip the init and return EBUSY "seems someone already
+                * inited" or EINVAL "it was inited differently".
+                */
+               memset(env->me_txns->mti_rmutex, 0, sizeof(*env->me_txns->mti_rmutex));
+               memset(env->me_txns->mti_wmutex, 0, sizeof(*env->me_txns->mti_wmutex));
+
                if ((rc = pthread_mutexattr_init(&mattr))
                        || (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))
 #ifdef MDB_ROBUST_SUPPORTED