MDB_LOCK_VERSION -> MDB_LOCK_FORMAT.
authorHallvard Furuseth <hallvard@openldap.org>
Thu, 8 Aug 2013 17:43:04 +0000 (19:43 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Thu, 8 Aug 2013 17:43:04 +0000 (19:43 +0200)
Pid locking needs a different lockfile-version: MDB_env's with and
without pid locking must not coexist, they can sabotage each other.
Store MDB_LOCK_FORMAT = (version | "use locking" flag) instead.

libraries/liblmdb/mdb.c

index 1c60e0c..345d6d6 100644 (file)
  *     @{
  */
 #ifdef _WIN32
+#define MDB_PIDLOCK    0
 #define pthread_t      DWORD
 #define pthread_mutex_t        HANDLE
 #define pthread_key_t  DWORD
 
 #define        Z       "z"
 
+       /** For MDB_LOCK_FORMAT: True if readers take a pid lock in the lockfile */
+#define MDB_PIDLOCK                    1
+
 #ifdef MDB_USE_POSIX_SEM
 
 #define LOCK_MUTEX_R(env)      mdb_sem_wait((env)->me_rmutex)
@@ -523,8 +527,8 @@ typedef struct MDB_txbody {
                /** Stamp identifying this as an MDB file. It must be set
                 *      to #MDB_MAGIC. */
        uint32_t        mtb_magic;
-               /** Version number of this lock file. Must be set to #MDB_LOCK_VERSION. */
-       uint32_t        mtb_version;
+               /** Format of this lock file. Must be set to #MDB_LOCK_FORMAT. */
+       uint32_t        mtb_format;
 #if defined(_WIN32) || defined(MDB_USE_POSIX_SEM)
        char    mtb_rmname[MNAME_LEN];
 #else
@@ -550,7 +554,7 @@ typedef struct MDB_txninfo {
        union {
                MDB_txbody mtb;
 #define mti_magic      mt1.mtb.mtb_magic
-#define mti_version    mt1.mtb.mtb_version
+#define mti_format     mt1.mtb.mtb_format
 #define mti_mutex      mt1.mtb.mtb_mutex
 #define mti_rmname     mt1.mtb.mtb_rmname
 #define mti_txnid      mt1.mtb.mtb_txnid
@@ -569,6 +573,13 @@ typedef struct MDB_txninfo {
        } mt2;
        MDB_reader      mti_readers[1];
 } MDB_txninfo;
+
+       /** Lockfile format signature: version, features and field layout */
+#define MDB_LOCK_FORMAT \
+       ((uint32_t) \
+        ((MDB_LOCK_VERSION) \
+         /* Flags which describe functionality */ \
+         + (((MDB_PIDLOCK) != 0) << 16)))
 /** @} */
 
 /** Common header for all page types.
@@ -2013,7 +2024,7 @@ mdb_cursors_close(MDB_txn *txn, unsigned merge)
 static void
 mdb_txn_reset0(MDB_txn *txn, const char *act);
 
-#ifdef _WIN32
+#if !(MDB_PIDLOCK)             /* Currently the same as defined(_WIN32) */
 enum Pidlock_op {
        Pidset, Pidcheck
 };
@@ -2034,7 +2045,7 @@ enum Pidlock_op {
 static int
 mdb_reader_pid(MDB_env *env, enum Pidlock_op op, pid_t pid)
 {
-#ifdef _WIN32
+#if !(MDB_PIDLOCK)             /* Currently the same as defined(_WIN32) */
        int ret = 0;
        HANDLE h;
        if (op == Pidcheck) {
@@ -3776,8 +3787,8 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
                pthread_mutexattr_destroy(&mattr);
 #endif /* _WIN32 || MDB_USE_POSIX_SEM */
 
-               env->me_txns->mti_version = MDB_LOCK_VERSION;
                env->me_txns->mti_magic = MDB_MAGIC;
+               env->me_txns->mti_format = MDB_LOCK_FORMAT;
                env->me_txns->mti_txnid = 0;
                env->me_txns->mti_numreaders = 0;
 
@@ -3787,9 +3798,9 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
                        rc = MDB_INVALID;
                        goto fail;
                }
-               if (env->me_txns->mti_version != MDB_LOCK_VERSION) {
-                       DPRINTF("lock region is version %u, expected version %u",
-                               env->me_txns->mti_version, MDB_LOCK_VERSION);
+               if (env->me_txns->mti_format != MDB_LOCK_FORMAT) {
+                       DPRINTF("lock region has format+version 0x%x, expected 0x%x",
+                               env->me_txns->mti_format, MDB_LOCK_FORMAT);
                        rc = MDB_VERSION_MISMATCH;
                        goto fail;
                }