ITS#8339 Solaris 10/11 robust mutex fixes

Check for PTHREAD_MUTEX_ROBUST_NP definition (this doesn't work
on Linux/glibc because they used an enum). Zero out mutex before
initing.
mdb.RE/0.9
Howard Chu 9 years ago
parent b785bfbe61
commit 21ed2bd4c9
  1. 10
      libraries/liblmdb/mdb.c

@ -257,7 +257,8 @@ typedef SSIZE_T ssize_t;
# else # else
# define MDB_USE_ROBUST 1 # define MDB_USE_ROBUST 1
/* glibc < 2.12 only provided _np API */ /* 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_MUTEX_ROBUST PTHREAD_MUTEX_ROBUST_NP
# define pthread_mutexattr_setrobust(attr, flag) pthread_mutexattr_setrobust_np(attr, flag) # define pthread_mutexattr_setrobust(attr, flag) pthread_mutexattr_setrobust_np(attr, flag)
# define pthread_mutex_consistent(mutex) pthread_mutex_consistent_np(mutex) # define pthread_mutex_consistent(mutex) pthread_mutex_consistent_np(mutex)
@ -4620,6 +4621,13 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
#else /* MDB_USE_POSIX_MUTEX: */ #else /* MDB_USE_POSIX_MUTEX: */
pthread_mutexattr_t mattr; 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)) if ((rc = pthread_mutexattr_init(&mattr))
|| (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED)) || (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))
#ifdef MDB_ROBUST_SUPPORTED #ifdef MDB_ROBUST_SUPPORTED

Loading…
Cancel
Save