Free write mutex earlier in txn_reset0

vl32b
Howard Chu 11 years ago
parent a2ac10107e
commit f6add293a7
  1. 27
      libraries/liblmdb/mdb.c

@ -2798,12 +2798,26 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
txn->mt_numdbs = 0; /* close nothing if called again */ txn->mt_numdbs = 0; /* close nothing if called again */
txn->mt_dbxs = NULL; /* mark txn as reset */ txn->mt_dbxs = NULL; /* mark txn as reset */
} else { } else {
pgno_t *pghead = env->me_pghead;
env->me_pghead = NULL;
env->me_pglast = 0;
if (!txn->mt_parent) {
if (mdb_midl_shrink(&txn->mt_free_pgs))
env->me_free_pgs = txn->mt_free_pgs;
env->me_txn = NULL;
/* The writer mutex was locked in mdb_txn_begin. */
if (env->me_txns)
UNLOCK_MUTEX(MDB_MUTEX(env, w));
}
mdb_cursors_close(txn, 0); mdb_cursors_close(txn, 0);
if (!(env->me_flags & MDB_WRITEMAP)) { if (!(env->me_flags & MDB_WRITEMAP)) {
mdb_dlist_free(txn); mdb_dlist_free(txn);
} }
mdb_midl_free(env->me_pghead); mdb_midl_free(pghead);
if (txn->mt_parent) { if (txn->mt_parent) {
txn->mt_parent->mt_child = NULL; txn->mt_parent->mt_child = NULL;
@ -2811,18 +2825,7 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
mdb_midl_free(txn->mt_free_pgs); mdb_midl_free(txn->mt_free_pgs);
mdb_midl_free(txn->mt_spill_pgs); mdb_midl_free(txn->mt_spill_pgs);
free(txn->mt_u.dirty_list); free(txn->mt_u.dirty_list);
return;
} }
if (mdb_midl_shrink(&txn->mt_free_pgs))
env->me_free_pgs = txn->mt_free_pgs;
env->me_pghead = NULL;
env->me_pglast = 0;
env->me_txn = NULL;
/* The writer mutex was locked in mdb_txn_begin. */
if (env->me_txns)
UNLOCK_MUTEX(MDB_MUTEX(env, w));
} }
} }

Loading…
Cancel
Save