Commit 9a80a8a8 authored by Leonid Yuriev's avatar Leonid Yuriev Committed by Howard Chu
Browse files

ITS#7969 LMDB: volatile & __synchronize().

Globally shared fields of meta-data are not 'volatile'.
parent 925e7805
...@@ -610,11 +610,11 @@ typedef struct MDB_rxbody { ...@@ -610,11 +610,11 @@ typedef struct MDB_rxbody {
* started from so we can avoid overwriting any data used in that * started from so we can avoid overwriting any data used in that
* particular version. * particular version.
*/ */
txnid_t mrb_txnid; volatile txnid_t mrb_txnid;
/** The process ID of the process owning this reader txn. */ /** The process ID of the process owning this reader txn. */
MDB_PID_T mrb_pid; volatile MDB_PID_T mrb_pid;
/** The thread ID of the thread owning this txn. */ /** The thread ID of the thread owning this txn. */
MDB_THR_T mrb_tid; volatile MDB_THR_T mrb_tid;
} MDB_rxbody; } MDB_rxbody;
/** The actual reader record, with cacheline padding. */ /** The actual reader record, with cacheline padding. */
...@@ -664,12 +664,12 @@ typedef struct MDB_txbody { ...@@ -664,12 +664,12 @@ typedef struct MDB_txbody {
* This is recorded here only for convenience; the value can always * This is recorded here only for convenience; the value can always
* be determined by reading the main database meta pages. * be determined by reading the main database meta pages.
*/ */
txnid_t mtb_txnid; volatile txnid_t mtb_txnid;
/** The number of slots that have been used in the reader table. /** The number of slots that have been used in the reader table.
* This always records the maximum count, it is not decremented * This always records the maximum count, it is not decremented
* when readers release their slots. * when readers release their slots.
*/ */
unsigned mtb_numreaders; volatile unsigned mtb_numreaders;
} MDB_txbody; } MDB_txbody;
/** The actual reader table definition. */ /** The actual reader table definition. */
...@@ -942,7 +942,7 @@ typedef struct MDB_meta { ...@@ -942,7 +942,7 @@ typedef struct MDB_meta {
/** Any persistent environment flags. @ref mdb_env */ /** Any persistent environment flags. @ref mdb_env */
#define mm_flags mm_dbs[0].md_flags #define mm_flags mm_dbs[0].md_flags
pgno_t mm_last_pg; /**< last used page in file */ pgno_t mm_last_pg; /**< last used page in file */
txnid_t mm_txnid; /**< txnid that committed this page */ volatile txnid_t mm_txnid; /**< txnid that committed this page */
} MDB_meta; } MDB_meta;
/** Buffer for a stack-allocated meta page. /** Buffer for a stack-allocated meta page.
...@@ -3601,6 +3601,10 @@ mdb_env_write_meta(MDB_txn *txn) ...@@ -3601,6 +3601,10 @@ mdb_env_write_meta(MDB_txn *txn)
mp->mm_dbs[0] = txn->mt_dbs[0]; mp->mm_dbs[0] = txn->mt_dbs[0];
mp->mm_dbs[1] = txn->mt_dbs[1]; mp->mm_dbs[1] = txn->mt_dbs[1];
mp->mm_last_pg = txn->mt_next_pgno - 1; mp->mm_last_pg = txn->mt_next_pgno - 1;
#if !(defined(_MSC_VER) || defined(__i386__) || defined(__x86_64__))
/* LY: issue a memory barrier, if not x86. ITS#7969 */
__sync_synchronize();
#endif
mp->mm_txnid = txn->mt_txnid; mp->mm_txnid = txn->mt_txnid;
if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) {
unsigned meta_size = env->me_psize; unsigned meta_size = env->me_psize;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment