lmdb: more coherent-barriers where reader's pid updated.

Change-Id: I6262021c074a99e2f548c1fda94fd53c584d2b89
This commit is contained in:
Leo Yuriev 2015-01-17 17:18:46 +03:00
parent ae747bb4ce
commit 1ca2b54966

10
mdb.c
View File

@ -2200,6 +2200,7 @@ mdb_oomkick_laggard(MDB_env *env)
if (rc > 1) { if (rc > 1) {
r->mr_tid = 0; r->mr_tid = 0;
r->mr_pid = 0; r->mr_pid = 0;
mdb_coherent_barrier();
} }
} }
} }
@ -2988,6 +2989,7 @@ mdb_txn_renew0(MDB_txn *txn)
new_notls = (env->me_flags & MDB_NOTLS); new_notls = (env->me_flags & MDB_NOTLS);
if (!new_notls && (rc=pthread_setspecific(env->me_txkey, r))) { if (!new_notls && (rc=pthread_setspecific(env->me_txkey, r))) {
r->mr_pid = 0; r->mr_pid = 0;
mdb_coherent_barrier();
return rc; return rc;
} }
} }
@ -2997,6 +2999,7 @@ mdb_txn_renew0(MDB_txn *txn)
} while(r->mr_txnid != ti->mti_txnid); } while(r->mr_txnid != ti->mti_txnid);
txn->mt_txnid = r->mr_txnid; txn->mt_txnid = r->mr_txnid;
txn->mt_u.reader = r; txn->mt_u.reader = r;
mdb_coherent_barrier();
meta = env->me_metas[txn->mt_txnid & 1]; meta = env->me_metas[txn->mt_txnid & 1];
} }
} else { } else {
@ -3050,6 +3053,7 @@ mdb_txn_renew0(MDB_txn *txn)
if (new_notls) { if (new_notls) {
txn->mt_u.reader->mr_pid = 0; txn->mt_u.reader->mr_pid = 0;
txn->mt_u.reader = NULL; txn->mt_u.reader = NULL;
mdb_coherent_barrier();
} }
return MDB_MAP_RESIZED; return MDB_MAP_RESIZED;
} }
@ -3344,8 +3348,10 @@ mdb_txn_abort(MDB_txn *txn)
mdb_txn_reset0(txn, "abort"); mdb_txn_reset0(txn, "abort");
/* Free reader slot tied to this txn (if MDB_NOTLS && writable FS) */ /* Free reader slot tied to this txn (if MDB_NOTLS && writable FS) */
if ((txn->mt_flags & MDB_TXN_RDONLY) && txn->mt_u.reader) if ((txn->mt_flags & MDB_TXN_RDONLY) && txn->mt_u.reader) {
txn->mt_u.reader->mr_pid = 0; txn->mt_u.reader->mr_pid = 0;
mdb_coherent_barrier();
}
if (txn != txn->mt_env->me_txn0) if (txn != txn->mt_env->me_txn0)
free(txn); free(txn);
@ -4697,6 +4703,7 @@ mdb_env_reader_dest(void *ptr)
MDB_reader *reader = ptr; MDB_reader *reader = ptr;
reader->mr_pid = 0; reader->mr_pid = 0;
mdb_coherent_barrier();
} }
#ifdef _WIN32 #ifdef _WIN32
@ -5372,6 +5379,7 @@ mdb_env_close0(MDB_env *env, int excl)
for (i = env->me_close_readers; --i >= 0; ) for (i = env->me_close_readers; --i >= 0; )
if (env->me_txns->mti_readers[i].mr_pid == pid) if (env->me_txns->mti_readers[i].mr_pid == pid)
env->me_txns->mti_readers[i].mr_pid = 0; env->me_txns->mti_readers[i].mr_pid = 0;
mdb_coherent_barrier();
#ifdef _WIN32 #ifdef _WIN32
if (env->me_rmutex) { if (env->me_rmutex) {
CloseHandle(env->me_rmutex); CloseHandle(env->me_rmutex);