]> git.sur5r.net Git - openldap/commitdiff
Get pid lock outside of rmutex
authorHoward Chu <hyc@symas.com>
Fri, 19 Jul 2013 16:55:10 +0000 (09:55 -0700)
committerHoward Chu <hyc@symas.com>
Fri, 19 Jul 2013 16:55:10 +0000 (09:55 -0700)
Avoid holding rmutex for longer than necessary.

libraries/liblmdb/mdb.c

index a4f6238e0019076d60e8f1f114093eeb09827557..1e26d16ed4915c9ac04cc105164243bffffdef01 100644 (file)
@@ -2078,14 +2078,6 @@ mdb_txn_renew0(MDB_txn *txn)
                                pid_t pid = env->me_pid;
                                pthread_t tid = pthread_self();
 
-                               LOCK_MUTEX_R(env);
-                               for (i=0; i<env->me_txns->mti_numreaders; i++)
-                                       if (env->me_txns->mti_readers[i].mr_pid == 0)
-                                               break;
-                               if (i == env->me_maxreaders) {
-                                       UNLOCK_MUTEX_R(env);
-                                       return MDB_READERS_FULL;
-                               }
                                if (!(env->me_flags & MDB_LIVE_READER)) {
                                        rc = mdb_reader_pid(env, Pidset, pid);
                                        if (rc) {
@@ -2094,6 +2086,15 @@ mdb_txn_renew0(MDB_txn *txn)
                                        }
                                        env->me_flags |= MDB_LIVE_READER;
                                }
+
+                               LOCK_MUTEX_R(env);
+                               for (i=0; i<env->me_txns->mti_numreaders; i++)
+                                       if (env->me_txns->mti_readers[i].mr_pid == 0)
+                                               break;
+                               if (i == env->me_maxreaders) {
+                                       UNLOCK_MUTEX_R(env);
+                                       return MDB_READERS_FULL;
+                               }
                                env->me_txns->mti_readers[i].mr_pid = pid;
                                env->me_txns->mti_readers[i].mr_tid = tid;
                                if (i >= env->me_txns->mti_numreaders)