Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Rings:2-TestDVD
lmdb
0001-Patch-for-LMDB-to-use-robust-mutexes.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0001-Patch-for-LMDB-to-use-robust-mutexes.patch of Package lmdb
diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x autom4te.cache -x .deps -x .libs ../orig-liblmdb/configure.ac ./configure.ac --- ../orig-liblmdb/configure.ac 2014-07-28 17:44:41.873398363 +0200 +++ ./configure.ac 2014-07-28 17:47:06.143497590 +0200 @@ -11,5 +11,12 @@ m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) LT_INIT AC_CHECK_HEADERS([sys/file.h]) +AC_CHECK_LIB([pthread], [pthread_mutex_lock]) +AC_CHECK_LIB([pthreadGC2], [pthread_mutex_lock]) +AS_IF([test "$ac_cv_lib_pthread" = "no" && test "$ac_cv_lib_pthreadGC2" = "no"], +[ + AC_MSG_ERROR([Could not find pthreads library]) +]) +AC_CHECK_FUNCS([pthread_mutexattr_settype pthread_mutexattr_setrobust]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff -wruN -x '*~' -x '*.o' -x '*.a' -x '*.so' -x '*.so.[0-9]' -x autom4te.cache -x .deps -x .libs ../orig-liblmdb/mdb.c ./mdb.c --- ../orig-liblmdb/mdb.c 2014-01-31 09:23:13.341427766 +0100 +++ ./mdb.c 2014-07-28 17:44:55.145959267 +0200 @@ -207,6 +207,7 @@ extern int cacheflush(char *addr, int nbytes, int cache); #define MDB_USE_HASH 1 #define MDB_PIDLOCK 0 #define THREAD_RET DWORD +#define EOWNERDEAD 130 #define pthread_t HANDLE #define pthread_mutex_t HANDLE #define pthread_cond_t HANDLE @@ -218,7 +219,7 @@ extern int cacheflush(char *addr, int nbytes, int cache); #define pthread_getspecific(x) TlsGetValue(x) #define pthread_setspecific(x,y) (TlsSetValue(x,y) ? 0 : ErrCode()) #define pthread_mutex_unlock(x) ReleaseMutex(*x) -#define pthread_mutex_lock(x) WaitForSingleObject(*x, INFINITE) +#define pthread_mutex_lock(x) (WaitForSingleObject(x, INFINITE) == WAIT_ABANDONED ? EOWNERDEAD : 0) // masks FAIL and TIMEOUT error, but acceptable #define pthread_cond_signal(x) SetEvent(*x) #define pthread_cond_wait(cond,mutex) do{SignalObjectAndWait(*mutex, *cond, INFINITE, FALSE); WaitForSingleObject(*mutex, INFINITE);}while(0) #define THREAD_CREATE(thr,start,arg) thr=CreateThread(NULL,0,start,arg,0,NULL) @@ -2498,7 +2499,20 @@ mdb_txn_renew0(MDB_txn *txn) env->me_live_reader = 1; } - LOCK_MUTEX_R(env); + rc = LOCK_MUTEX_R(env); + switch (rc) + { + case 0: + break; +#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST + case EOWNERDEAD: + // we cannot recover the state, so mark mutex as unusable + UNLOCK_MUTEX_R(env); + // FALLTHROUGH +#endif + default: + return MDB_PANIC; + } nr = ti->mti_numreaders; for (i=0; i<nr; i++) if (ti->mti_readers[i].mr_pid == 0) @@ -2528,7 +2542,20 @@ mdb_txn_renew0(MDB_txn *txn) } } else { if (ti) { - LOCK_MUTEX_W(env); + rc = LOCK_MUTEX_W(env); + switch (rc) + { + case 0: + break; +#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST + case EOWNERDEAD: + // we cannot recover the state, so mark mutex as unusable + UNLOCK_MUTEX_W(env); + // FALLTHROUGH +#endif + default: + return MDB_PANIC; + } txn->mt_txnid = ti->mti_txnid; meta = env->me_metas[txn->mt_txnid & 1]; @@ -4330,6 +4357,12 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl) pthread_mutexattr_t mattr; if ((rc = pthread_mutexattr_init(&mattr)) +#ifdef HAVE_PTHREAD_MUTEXATTR_SETTYPE + || (rc = pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_ERRORCHECK)) +#endif +#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST + || (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST)) +#endif || (rc = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED)) || (rc = pthread_mutex_init(&env->me_txns->mti_mutex, &mattr)) || (rc = pthread_mutex_init(&env->me_txns->mti_wmutex, &mattr)))
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor