mdbx: Add MDB_USE_ROBUST to control Robust Mutexes.

Backported from origin.

Change-Id: I416c1d09fb1f290423f29a84831accdaf4436ab0
This commit is contained in:
Leo Yuriev 2015-11-06 17:26:41 +03:00
parent 372a6d8521
commit b430c9a22f
2 changed files with 21 additions and 12 deletions

View File

@ -1,25 +1,22 @@
# Makefile for liblmdb (Lightning memory-mapped database library). # Makefile for libmdbx (lightning memory-mapped database library for Linux).
######################################################################## ########################################################################
# Configuration. The compiler options must enable threaded compilation. # Configuration. The compiler options must enable threaded compilation.
# #
# Preprocessor macros (for CPPFLAGS) of interest... # Preprocessor macros (for XCFLAGS) of interest...
# Note that the defaults should already be correct for most # Note that the defaults should already be correct for most
# platforms; you should not need to change any of these. # platforms; you should not need to change any of these.
# Read their descriptions in mdb.c if you do: # Read their descriptions in mdb.c if you do:
# #
# - MDB_USE_POSIX_SEM # - MDB_USE_ROBUST
# - MDB_DSYNC
# - MDB_FDATASYNC
# - MDB_FDATASYNC_WORKS
# - MDB_USE_PWRITEV
# #
# There may be other macros in mdb.c of interest. You should # There may be other macros in mdb.c of interest. You should
# read mdb.c before changing any of them. # read mdb.c before changing any of them.
# #
CC ?= gcc CC ?= gcc
XCFLAGS ?=
CFLAGS ?= -O2 -g -Wall -Werror -Wno-unused-parameter CFLAGS ?= -O2 -g -Wall -Werror -Wno-unused-parameter
CFLAGS += -pthread CFLAGS += -pthread $(XCFLAGS)
prefix ?= /usr/local prefix ?= /usr/local
######################################################################## ########################################################################

20
mdb.c
View File

@ -142,6 +142,18 @@
# define mdb_func_ "<mdb_unknown>" # define mdb_func_ "<mdb_unknown>"
#endif #endif
/** Some platforms define the EOWNERDEAD error code
* even though they don't support Robust Mutexes.
* Compile with -DMDB_USE_ROBUST=0.
*/
#ifndef MDB_USE_ROBUST
# if defined(EOWNERDEAD) && defined(PTHREAD_MUTEX_ROBUST) && !defined(ANDROID)
# define MDB_USE_ROBUST 1
# else
# define MDB_USE_ROBUST 0
# endif
#endif /* MDB_USE_ROBUST */
/* Internal error codes, not exposed outside liblmdb */ /* Internal error codes, not exposed outside liblmdb */
#define MDB_NO_ROOT (MDB_LAST_ERRCODE + 10) #define MDB_NO_ROOT (MDB_LAST_ERRCODE + 10)
@ -4627,9 +4639,9 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
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 EOWNERDEAD #if MDB_USE_ROBUST
|| (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST)) || (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST))
#endif #endif /* MDB_USE_ROBUST */
|| (rc = pthread_mutex_init(&env->me_txns->mti_rmutex, &mattr)) || (rc = pthread_mutex_init(&env->me_txns->mti_rmutex, &mattr))
|| (rc = pthread_mutex_init(&env->me_txns->mti_wmutex, &mattr))) || (rc = pthread_mutex_init(&env->me_txns->mti_wmutex, &mattr)))
goto fail; goto fail;
@ -10003,7 +10015,7 @@ mdb_reader_check0(MDB_env *env, int rlocked, int *dead)
static int __cold static int __cold
mdb_mutex_failed(MDB_env *env, pthread_mutex_t *mutex, int rc) mdb_mutex_failed(MDB_env *env, pthread_mutex_t *mutex, int rc)
{ {
#ifdef EOWNERDEAD #if MDB_USE_ROBUST
if (unlikely(rc == EOWNERDEAD)) { if (unlikely(rc == EOWNERDEAD)) {
int rlocked, rc2; int rlocked, rc2;
@ -10038,7 +10050,7 @@ mdb_mutex_failed(MDB_env *env, pthread_mutex_t *mutex, int rc)
pthread_mutex_unlock(mutex); pthread_mutex_unlock(mutex);
} }
} }
#endif /* EOWNERDEAD */ #endif /* MDB_USE_ROBUST */
if (unlikely(rc)) { if (unlikely(rc)) {
mdb_debug("lock mutex failed, %s", mdb_strerror(rc)); mdb_debug("lock mutex failed, %s", mdb_strerror(rc));
if (rc != EDEADLK) { if (rc != EDEADLK) {