|
|
|
@ -161,7 +161,10 @@ typedef SSIZE_T ssize_t; |
|
|
|
|
#include <resolv.h> /* defines BYTE_ORDER on HPUX and Solaris */ |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if defined(__APPLE__) || defined (BSD) || defined(__FreeBSD_kernel__) |
|
|
|
|
#if defined(__FreeBSD__) && defined(__FreeBSD_version) && __FreeBSD_version >= 1100110 |
|
|
|
|
# define MDB_USE_POSIX_MUTEX 1 |
|
|
|
|
# define MDB_USE_ROBUST 1 |
|
|
|
|
#elif defined(__APPLE__) || defined (BSD) || defined(__FreeBSD_kernel__) |
|
|
|
|
# if !(defined(MDB_USE_POSIX_MUTEX) || defined(MDB_USE_POSIX_SEM)) |
|
|
|
|
# define MDB_USE_SYSV_SEM 1 |
|
|
|
|
# endif |
|
|
|
@ -1719,7 +1722,7 @@ static int mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, |
|
|
|
|
static int mdb_env_read_header(MDB_env *env, int prev, MDB_meta *meta); |
|
|
|
|
static MDB_meta *mdb_env_pick_meta(const MDB_env *env); |
|
|
|
|
static int mdb_env_write_meta(MDB_txn *txn); |
|
|
|
|
#ifdef MDB_USE_POSIX_MUTEX /* Drop unused excl arg */ |
|
|
|
|
#if defined(MDB_USE_POSIX_MUTEX) && !defined(MDB_ROBUST_SUPPORTED) /* Drop unused excl arg */ |
|
|
|
|
# define mdb_env_close_active(env, excl) mdb_env_close1(env) |
|
|
|
|
#endif |
|
|
|
|
static void mdb_env_close_active(MDB_env *env, int excl); |
|
|
|
@ -6180,6 +6183,17 @@ mdb_env_close_active(MDB_env *env, int excl) |
|
|
|
|
if (excl > 0) |
|
|
|
|
semctl(env->me_rmutex->semid, 0, IPC_RMID); |
|
|
|
|
} |
|
|
|
|
#elif defined(MDB_ROBUST_SUPPORTED) |
|
|
|
|
/* If we have the filelock: If we are the
|
|
|
|
|
* only remaining user, clean up robust |
|
|
|
|
* mutexes. |
|
|
|
|
*/ |
|
|
|
|
if (excl == 0) |
|
|
|
|
mdb_env_excl_lock(env, &excl); |
|
|
|
|
if (excl > 0) { |
|
|
|
|
pthread_mutex_destroy(env->me_txns->mti_rmutex); |
|
|
|
|
pthread_mutex_destroy(env->me_txns->mti_wmutex); |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
munmap((void *)env->me_txns, (env->me_maxreaders-1)*sizeof(MDB_reader)+sizeof(MDB_txninfo)); |
|
|
|
|
} |
|
|
|
|