Microoptimize loose pages
authorHallvard Furuseth <h.b.furuseth@usit.uio.no>
Sat, 16 Aug 2014 23:50:32 +0000 (01:50 +0200)
committerHallvard Furuseth <h.b.furuseth@usit.uio.no>
Sat, 16 Aug 2014 23:50:32 +0000 (01:50 +0200)
libraries/liblmdb/mdb.c

index 47a230bbfd095a2aef3018af36db849112938857..6afd615621cf500a5b5208880c186bda3fa15ca9 100644 (file)
@@ -1634,10 +1634,11 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
 {
        int loose = 0;
        pgno_t pgno = mp->mp_pgno;
+       MDB_txn *txn = mc->mc_txn;
 
        if ((mp->mp_flags & P_DIRTY) && mc->mc_dbi != FREE_DBI) {
-               if (mc->mc_txn->mt_parent) {
-                       MDB_ID2 *dl = mc->mc_txn->mt_u.dirty_list;
+               if (txn->mt_parent) {
+                       MDB_ID2 *dl = txn->mt_u.dirty_list;
                        /* If txn has a parent, make sure the page is in our
                         * dirty list.
                         */
@@ -1646,7 +1647,7 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
                                if (x <= dl[0].mid && dl[x].mid == pgno) {
                                        if (mp != dl[x].mptr) { /* bad cursor? */
                                                mc->mc_flags &= ~(C_INITIALIZED|C_EOF);
-                                               mc->mc_txn->mt_flags |= MDB_TXN_ERROR;
+                                               txn->mt_flags |= MDB_TXN_ERROR;
                                                return MDB_CORRUPTED;
                                        }
                                        /* ok, it's ours */
@@ -1661,12 +1662,12 @@ mdb_page_loose(MDB_cursor *mc, MDB_page *mp)
        if (loose) {
                DPRINTF(("loosen db %d page %"Z"u", DDBI(mc),
                        mp->mp_pgno));
-               NEXT_LOOSE_PAGE(mp) = mc->mc_txn->mt_loose_pgs;
-               mc->mc_txn->mt_loose_pgs = mp;
-               mc->mc_txn->mt_loose_count++;
+               NEXT_LOOSE_PAGE(mp) = txn->mt_loose_pgs;
+               txn->mt_loose_pgs = mp;
+               txn->mt_loose_count++;
                mp->mp_flags |= P_LOOSE;
        } else {
-               int rc = mdb_midl_append(&mc->mc_txn->mt_free_pgs, pgno);
+               int rc = mdb_midl_append(&txn->mt_free_pgs, pgno);
                if (rc)
                        return rc;
        }
@@ -2827,7 +2828,7 @@ mdb_freelist_save(MDB_txn *txn)
                        return rc;
        }
 
-       if (!env->me_pghead) {
+       if (!env->me_pghead && txn->mt_loose_pgs) {
                /* Put loose page numbers in mt_free_pgs, since
                 * we may be unable to return them to me_pghead.
                 */