ITS#7961,#7987 Re-fix txn init.

More fallout from 4d02c741b120786df1b87ee9ed49c1d3f9bc7522:
Don't modify another thread's write txn. Reinit me_txn0 fully.
mdb.RE/0.9
Hallvard Furuseth 10 years ago
parent 3ce002fd13
commit 17bf75b12e
  1. 17
      libraries/liblmdb/mdb.c

@ -2542,6 +2542,10 @@ mdb_txn_renew0(MDB_txn *txn)
if (txn->mt_txnid == mdb_debug_start) if (txn->mt_txnid == mdb_debug_start)
mdb_debug = 1; mdb_debug = 1;
#endif #endif
txn->mt_flags = 0;
txn->mt_child = NULL;
txn->mt_loose_pgs = NULL;
txn->mt_loose_count = 0;
txn->mt_dirty_room = MDB_IDL_UM_MAX; txn->mt_dirty_room = MDB_IDL_UM_MAX;
txn->mt_u.dirty_list = env->me_dirty_list; txn->mt_u.dirty_list = env->me_dirty_list;
txn->mt_u.dirty_list[0].mid = 0; txn->mt_u.dirty_list[0].mid = 0;
@ -2627,7 +2631,6 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret)
if (!(flags & MDB_RDONLY)) { if (!(flags & MDB_RDONLY)) {
if (!parent) { if (!parent) {
txn = env->me_txn0; /* just reuse preallocated write txn */ txn = env->me_txn0; /* just reuse preallocated write txn */
txn->mt_flags = 0;
goto ok; goto ok;
} }
/* child txns use own copy of cursors */ /* child txns use own copy of cursors */
@ -2778,6 +2781,8 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
env->me_pghead = NULL; env->me_pghead = NULL;
env->me_pglast = 0; env->me_pglast = 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);
} }
@ -2790,19 +2795,15 @@ mdb_txn_reset0(MDB_txn *txn, const char *act)
/* The writer mutex was locked in mdb_txn_begin. */ /* The writer mutex was locked in mdb_txn_begin. */
if (env->me_txns) if (env->me_txns)
UNLOCK_MUTEX_W(env); UNLOCK_MUTEX_W(env);
} } else {
mdb_cursors_close(txn, 0);
mdb_midl_free(pghead);
if (txn->mt_parent) {
txn->mt_parent->mt_child = NULL; txn->mt_parent->mt_child = NULL;
env->me_pgstate = ((MDB_ntxn *)txn)->mnt_pgstate; env->me_pgstate = ((MDB_ntxn *)txn)->mnt_pgstate;
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);
} }
mdb_midl_free(pghead);
} }
} }

Loading…
Cancel
Save