openldap@gulag.ch wrote:
Hi Hallvard
Thanks for the hint. Your are perfectly right, the mutex memory has to be zeroed in case of a robust mutex. Applied against 0.9.18 and it seems to work. My proposed patch is broken.
I've pushed a tweaked version of Hallvard's patch. While the Studio compiler defines __SunOS_5_10 it appears that gcc doesn't, so we took a different detection route.
There is a slight inconsistency if subsequent calls after a successfull pthread_mutexattr_init() fail (in the ORed if statement). This might result in a memory leak as the mutex attributes are not destroyed. But this is not related to the topic of this ITS.
Feel free to submit another ITS for that, thanks.
Thank you
Rolf
On 06/02/16 07:56 AM, Hallvard Breien Furuseth wrote:
Rolf, please try this instead, like the manpage you referred to says under Notes. Do not catch EBUSY/EINVAL, they do mean the mutex was not (re)inited.
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 0209c09..5ae93bc 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -304,7 +304,7 @@ 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(__SunOS_5_10) # 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) @@ -4963,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));
#ifdef MDB_ROBUST_SUPPORTEDif ((rc = pthread_mutexattr_init(&mattr)) || (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))