]> git.sur5r.net Git - openldap/commitdiff
ITS#7364 also close the mutexes as needed
authorHoward Chu <hyc@symas.com>
Thu, 23 Aug 2012 06:01:19 +0000 (23:01 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 23 Aug 2012 06:01:19 +0000 (23:01 -0700)
Otherwise a process that opens and closes an env more than once
will leak mutex handles. (WIN32/BSD)

libraries/libmdb/mdb.c

index a120a526486d4604b96a08147cdb771605901ddc..f8211c60199dba43155e4dead2824bc866c784be 100644 (file)
@@ -3154,7 +3154,16 @@ mdb_env_close(MDB_env *env)
                for (i=0; i<env->me_txns->mti_numreaders; i++)
                        if (env->me_txns->mti_readers[i].mr_pid == pid)
                                env->me_txns->mti_readers[i].mr_pid = 0;
+#ifdef _WIN32
+               CloseHandle(env->me_rmutex);
+               CloseHandle(env->me_wmutex);
+               /* Windows automatically destroys the mutexes when
+                * the last handle closes.
+                */
+#else
 #ifdef USE_POSIX_SEM
+               sem_close(env->me_rmutex);
+               sem_close(env->me_wmutex);
                { int excl = 0;
                        if (!mdb_env_excl_lock(env, &excl) && excl) {
                                /* we are the only remaining user of the environment.
@@ -3163,6 +3172,7 @@ mdb_env_close(MDB_env *env)
                                sem_unlink(env->me_txns->mti_wmname);
                        }
                }
+#endif
 #endif
                munmap((void *)env->me_txns, (env->me_maxreaders-1)*sizeof(MDB_reader)+sizeof(MDB_txninfo));
        }