Skip to content

Commit

Permalink
lmdb: Sync to upstream.
Browse files Browse the repository at this point in the history
  • Loading branch information
Marco van Wieringen committed Jun 10, 2016
1 parent a620340 commit f8dbb87
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions src/lmdb/mdb.c
Expand Up @@ -308,7 +308,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)
Expand Down Expand Up @@ -4967,18 +4968,29 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
if (semctl(semid, 0, SETALL, semu) < 0)
goto fail_errno;
env->me_txns->mti_semid = semid;
env->me_txns->mti_rlocked = 0;
env->me_txns->mti_wlocked = 0;
#else /* MDB_USE_POSIX_MUTEX: */
pthread_mutexattr_t mattr;

if ((rc = pthread_mutexattr_init(&mattr))
|| (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))
/* 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)) != 0)
goto fail;
rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
#ifdef MDB_ROBUST_SUPPORTED
|| (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST))
if (!rc) rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);
#endif
|| (rc = pthread_mutex_init(env->me_txns->mti_rmutex, &mattr))
|| (rc = pthread_mutex_init(env->me_txns->mti_wmutex, &mattr)))
goto fail;
if (!rc) rc = pthread_mutex_init(env->me_txns->mti_rmutex, &mattr);
if (!rc) rc = pthread_mutex_init(env->me_txns->mti_wmutex, &mattr);
pthread_mutexattr_destroy(&mattr);
if (rc)
goto fail;
#endif /* _WIN32 || ... */

env->me_txns->mti_magic = MDB_MAGIC;
Expand Down

0 comments on commit f8dbb87

Please sign in to comment.