mdbx: workaround for pthread_setspecific's memleak.

Change-Id: I8b48548a40bb2fe58db14b8f6944f5a3802ffbb9
This commit is contained in:
Leo Yuriev 2016-05-07 15:21:59 +03:00
parent 14b3afdcff
commit 8791e3243f

8
mdb.c
View File

@ -5019,6 +5019,7 @@ mdb_env_close0(MDB_env *env)
if (!(env->me_flags & MDB_ENV_ACTIVE)) if (!(env->me_flags & MDB_ENV_ACTIVE))
return; return;
env->me_flags &= ~MDB_ENV_ACTIVE;
/* Doing this here since me_dbxs may not exist during mdb_env_close */ /* Doing this here since me_dbxs may not exist during mdb_env_close */
if (env->me_dbxs) { if (env->me_dbxs) {
@ -5038,7 +5039,12 @@ mdb_env_close0(MDB_env *env)
mdb_midl_free(env->me_free_pgs); mdb_midl_free(env->me_free_pgs);
if (env->me_flags & MDB_ENV_TXKEY) { if (env->me_flags & MDB_ENV_TXKEY) {
struct MDB_rthc *rthc = pthread_getspecific(env->me_txkey);
if (rthc && pthread_setspecific(env->me_txkey, NULL) == 0) {
mdb_env_reader_destr(rthc);
}
pthread_key_delete(env->me_txkey); pthread_key_delete(env->me_txkey);
env->me_flags &= ~MDB_ENV_TXKEY;
} }
if (env->me_map) { if (env->me_map) {
@ -5083,8 +5089,6 @@ mdb_env_close0(MDB_env *env)
if (env->me_lfd != INVALID_HANDLE_VALUE) { if (env->me_lfd != INVALID_HANDLE_VALUE) {
(void) close(env->me_lfd); (void) close(env->me_lfd);
} }
env->me_flags &= ~(MDB_ENV_ACTIVE|MDB_ENV_TXKEY);
} }
#if ! MDBX_MODE_ENABLED #if ! MDBX_MODE_ENABLED