mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-24 00:29:35 -05:00
ITS#7969 LMDB: volatile & __synchronize().
Globally shared fields of meta-data are not 'volatile'.
This commit is contained in:
parent
925e7805a5
commit
9a80a8a8e8
1 changed files with 10 additions and 6 deletions
|
|
@ -610,11 +610,11 @@ typedef struct MDB_rxbody {
|
|||
* started from so we can avoid overwriting any data used in that
|
||||
* particular version.
|
||||
*/
|
||||
txnid_t mrb_txnid;
|
||||
volatile txnid_t mrb_txnid;
|
||||
/** 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. */
|
||||
MDB_THR_T mrb_tid;
|
||||
volatile MDB_THR_T mrb_tid;
|
||||
} MDB_rxbody;
|
||||
|
||||
/** The actual reader record, with cacheline padding. */
|
||||
|
|
@ -664,12 +664,12 @@ typedef struct MDB_txbody {
|
|||
* This is recorded here only for convenience; the value can always
|
||||
* 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.
|
||||
* This always records the maximum count, it is not decremented
|
||||
* when readers release their slots.
|
||||
*/
|
||||
unsigned mtb_numreaders;
|
||||
volatile unsigned mtb_numreaders;
|
||||
} MDB_txbody;
|
||||
|
||||
/** The actual reader table definition. */
|
||||
|
|
@ -942,7 +942,7 @@ typedef struct MDB_meta {
|
|||
/** Any persistent environment flags. @ref mdb_env */
|
||||
#define mm_flags mm_dbs[0].md_flags
|
||||
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;
|
||||
|
||||
/** Buffer for a stack-allocated meta page.
|
||||
|
|
@ -3601,6 +3601,10 @@ mdb_env_write_meta(MDB_txn *txn)
|
|||
mp->mm_dbs[0] = txn->mt_dbs[0];
|
||||
mp->mm_dbs[1] = txn->mt_dbs[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;
|
||||
if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) {
|
||||
unsigned meta_size = env->me_psize;
|
||||
|
|
|
|||
Loading…
Reference in a new issue