]> git.sur5r.net Git - openldap/commitdiff
ITS#7969 LMDB: volatile & __synchronize().
authorleo@yuriev.ru <leo@yuriev.ru>
Fri, 17 Oct 2014 22:22:39 +0000 (22:22 +0000)
committerHoward Chu <hyc@symas.com>
Sat, 18 Oct 2014 05:53:53 +0000 (06:53 +0100)
Globally shared fields of meta-data are not 'volatile'.

libraries/liblmdb/mdb.c

index 9e65c2741d956ccc2405c5071258db238406d6c5..c84c07f04239adf48268b6ce1853f3a764db66f9 100644 (file)
@@ -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;