Skip to content

Commit c11ef29

Browse files
hfuruhyc
authored andcommitted
CURSOR_TMP_[UN]TRACK() -> WITH_CURSOR_TRACKING()
1 parent 9e3101d commit c11ef29

File tree

1 file changed

+19
-27
lines changed

1 file changed

+19
-27
lines changed

libraries/liblmdb/mdb.c

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7524,21 +7524,21 @@ mdb_update_key(MDB_cursor *mc, MDB_val *key)
75247524
static void
75257525
mdb_cursor_copy(const MDB_cursor *csrc, MDB_cursor *cdst);
75267526

7527-
/** Track a temporary cursor */
7528-
#define CURSOR_TMP_TRACK(mc, mn, dummy, tracked) \
7529-
if (mc->mc_flags & C_SUB) { \
7527+
/** Perform \b act while tracking temporary cursor \b mn */
7528+
#define WITH_CURSOR_TRACKING(mn, act) do { \
7529+
MDB_cursor dummy, *tracked, **tp = &(mn).mc_txn->mt_cursors[mn.mc_dbi]; \
7530+
if ((mn).mc_flags & C_SUB) { \
75307531
dummy.mc_flags = C_INITIALIZED; \
7531-
dummy.mc_xcursor = (MDB_xcursor *)&mn; \
7532+
dummy.mc_xcursor = (MDB_xcursor *)&(mn); \
75327533
tracked = &dummy; \
75337534
} else { \
7534-
tracked = &mn; \
7535+
tracked = &(mn); \
75357536
} \
7536-
tracked->mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi]; \
7537-
mc->mc_txn->mt_cursors[mc->mc_dbi] = tracked
7538-
7539-
/** Stop tracking a temporary cursor */
7540-
#define CURSOR_TMP_UNTRACK(mc, tracked) \
7541-
mc->mc_txn->mt_cursors[mc->mc_dbi] = tracked->mc_next
7537+
tracked->mc_next = *tp; \
7538+
*tp = tracked; \
7539+
{ act; } \
7540+
*tp = tracked->mc_next; \
7541+
} while (0)
75427542

75437543
/** Move a node from csrc to cdst.
75447544
*/
@@ -7695,7 +7695,6 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
76957695
*/
76967696
if (csrc->mc_ki[csrc->mc_top] == 0) {
76977697
if (csrc->mc_ki[csrc->mc_top-1] != 0) {
7698-
MDB_cursor dummy, *tracked;
76997698
if (IS_LEAF2(csrc->mc_pg[csrc->mc_top])) {
77007699
key.mv_data = LEAF2KEY(csrc->mc_pg[csrc->mc_top], 0, key.mv_size);
77017700
} else {
@@ -7709,9 +7708,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
77097708
mn.mc_snum--;
77107709
mn.mc_top--;
77117710
/* We want mdb_rebalance to find mn when doing fixups */
7712-
CURSOR_TMP_TRACK(csrc, mn, dummy, tracked);
7713-
rc = mdb_update_key(&mn, &key);
7714-
CURSOR_TMP_UNTRACK(csrc, tracked);
7711+
WITH_CURSOR_TRACKING(mn,
7712+
rc = mdb_update_key(&mn, &key));
77157713
if (rc)
77167714
return rc;
77177715
}
@@ -7728,7 +7726,6 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
77287726

77297727
if (cdst->mc_ki[cdst->mc_top] == 0) {
77307728
if (cdst->mc_ki[cdst->mc_top-1] != 0) {
7731-
MDB_cursor dummy, *tracked;
77327729
if (IS_LEAF2(csrc->mc_pg[csrc->mc_top])) {
77337730
key.mv_data = LEAF2KEY(cdst->mc_pg[cdst->mc_top], 0, key.mv_size);
77347731
} else {
@@ -7742,9 +7739,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
77427739
mn.mc_snum--;
77437740
mn.mc_top--;
77447741
/* We want mdb_rebalance to find mn when doing fixups */
7745-
CURSOR_TMP_TRACK(cdst, mn, dummy, tracked);
7746-
rc = mdb_update_key(&mn, &key);
7747-
CURSOR_TMP_UNTRACK(cdst, tracked);
7742+
WITH_CURSOR_TRACKING(mn,
7743+
rc = mdb_update_key(&mn, &key));
77487744
if (rc)
77497745
return rc;
77507746
}
@@ -8103,13 +8099,11 @@ mdb_rebalance(MDB_cursor *mc)
81038099
if (!fromleft) {
81048100
rc = mdb_page_merge(&mn, mc);
81058101
} else {
8106-
MDB_cursor dummy, *tracked;
81078102
oldki += NUMKEYS(mn.mc_pg[mn.mc_top]);
81088103
mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1;
81098104
/* We want mdb_rebalance to find mn when doing fixups */
8110-
CURSOR_TMP_TRACK(mc, mn, dummy, tracked);
8111-
rc = mdb_page_merge(mc, &mn);
8112-
CURSOR_TMP_UNTRACK(mc, tracked);
8105+
WITH_CURSOR_TRACKING(mn,
8106+
rc = mdb_page_merge(mc, &mn));
81138107
mdb_cursor_copy(&mn, mc);
81148108
}
81158109
mc->mc_flags &= ~C_EOF;
@@ -8473,14 +8467,12 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
84738467
*/
84748468
if (SIZELEFT(mn.mc_pg[ptop]) < mdb_branch_size(env, &sepkey)) {
84758469
int snum = mc->mc_snum;
8476-
MDB_cursor dummy, *tracked;
84778470
mn.mc_snum--;
84788471
mn.mc_top--;
84798472
did_split = 1;
84808473
/* We want other splits to find mn when doing fixups */
8481-
CURSOR_TMP_TRACK(mc, mn, dummy, tracked);
8482-
rc = mdb_page_split(&mn, &sepkey, NULL, rp->mp_pgno, 0);
8483-
CURSOR_TMP_UNTRACK(mc, tracked);
8474+
WITH_CURSOR_TRACKING(mn,
8475+
rc = mdb_page_split(&mn, &sepkey, NULL, rp->mp_pgno, 0));
84848476
if (rc)
84858477
goto done;
84868478

0 commit comments

Comments
 (0)