Fix reader txn locking

vmware
Howard Chu 13 years ago
parent e3b668e84a
commit 51e210c604
  1. 21
      libraries/libmdb/mdb.c

@ -621,21 +621,20 @@ mdb_txn_begin(MDB_env *env, int rdonly, MDB_txn **ret)
if (!r) {
unsigned int i;
pthread_mutex_lock(&env->me_txns->mt_mutex);
for (i=0; i<env->me_maxreaders; i++) {
if (env->me_txns->mt_readers[i].mr_pid == 0) {
env->me_txns->mt_readers[i].mr_pid = getpid();
env->me_txns->mt_readers[i].mr_tid = pthread_self();
r = &env->me_txns->mt_readers[i];
pthread_setspecific(env->me_txkey, r);
if (i >= env->me_txns->mt_numreaders)
env->me_txns->mt_numreaders = i+1;
for (i=0; i<env->me_txns->mt_numreaders; i++)
if (env->me_txns->mt_readers[i].mr_pid == 0)
break;
}
}
pthread_mutex_unlock(&env->me_txns->mt_mutex);
if (i == env->me_maxreaders) {
pthread_mutex_unlock(&env->me_txns->mti_mutex);
return ENOSPC;
}
env->me_txns->mt_readers[i].mr_pid = getpid();
env->me_txns->mt_readers[i].mr_tid = pthread_self();
r = &env->me_txns->mt_readers[i];
pthread_setspecific(env->me_txkey, r);
if (i >= env->me_txns->mt_numreaders)
env->me_txns->mt_numreaders = i+1;
pthread_mutex_unlock(&env->me_txns->mt_mutex);
}
r->mr_txnid = txn->mt_txnid;
txn->mt_u.reader = r;

Loading…
Cancel
Save