Skip to content

Commit 21ed2bd

Browse files
committed
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.
1 parent b785bfb commit 21ed2bd

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

libraries/liblmdb/mdb.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ typedef SSIZE_T ssize_t;
257257
# else
258258
# define MDB_USE_ROBUST 1
259259
/* glibc < 2.12 only provided _np API */
260-
# if defined(__GLIBC__) && GLIBC_VER < 0x02000c
260+
# if (defined(__GLIBC__) && GLIBC_VER < 0x02000c) || \
261+
(defined(PTHREAD_MUTEX_ROBUST_NP) && !defined(PTHREAD_MUTEX_ROBUST))
261262
# define PTHREAD_MUTEX_ROBUST PTHREAD_MUTEX_ROBUST_NP
262263
# define pthread_mutexattr_setrobust(attr, flag) pthread_mutexattr_setrobust_np(attr, flag)
263264
# 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)
46204621
#else /* MDB_USE_POSIX_MUTEX: */
46214622
pthread_mutexattr_t mattr;
46224623

4624+
/* Solaris needs this before initing a robust mutex. Otherwise
4625+
* it may skip the init and return EBUSY "seems someone already
4626+
* inited" or EINVAL "it was inited differently".
4627+
*/
4628+
memset(env->me_txns->mti_rmutex, 0, sizeof(*env->me_txns->mti_rmutex));
4629+
memset(env->me_txns->mti_wmutex, 0, sizeof(*env->me_txns->mti_wmutex));
4630+
46234631
if ((rc = pthread_mutexattr_init(&mattr))
46244632
|| (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))
46254633
#ifdef MDB_ROBUST_SUPPORTED

0 commit comments

Comments
 (0)