From: Howard Chu Date: Wed, 10 Aug 2011 23:09:29 +0000 (-0700) Subject: Fix reader txn locking X-Git-Tag: OPENLDAP_REL_ENG_2_4_27~148^2~134 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=51e210c604d6c7b6a5f08306d18ad6adca9204b8;p=openldap Fix reader txn locking --- diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 7cb64417a4..545c7632db 100644 --- a/libraries/libmdb/mdb.c +++ b/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; ime_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; ime_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;