@@ -7524,21 +7524,21 @@ mdb_update_key(MDB_cursor *mc, MDB_val *key)
7524
7524
static void
7525
7525
mdb_cursor_copy (const MDB_cursor * csrc , MDB_cursor * cdst );
7526
7526
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) { \
7530
7531
dummy.mc_flags = C_INITIALIZED; \
7531
- dummy.mc_xcursor = (MDB_xcursor *)&mn; \
7532
+ dummy.mc_xcursor = (MDB_xcursor *)&(mn); \
7532
7533
tracked = &dummy; \
7533
7534
} else { \
7534
- tracked = &mn ; \
7535
+ tracked = &(mn) ; \
7535
7536
} \
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)
7542
7542
7543
7543
/** Move a node from csrc to cdst.
7544
7544
*/
@@ -7695,7 +7695,6 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7695
7695
*/
7696
7696
if (csrc -> mc_ki [csrc -> mc_top ] == 0 ) {
7697
7697
if (csrc -> mc_ki [csrc -> mc_top - 1 ] != 0 ) {
7698
- MDB_cursor dummy , * tracked ;
7699
7698
if (IS_LEAF2 (csrc -> mc_pg [csrc -> mc_top ])) {
7700
7699
key .mv_data = LEAF2KEY (csrc -> mc_pg [csrc -> mc_top ], 0 , key .mv_size );
7701
7700
} else {
@@ -7709,9 +7708,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7709
7708
mn .mc_snum -- ;
7710
7709
mn .mc_top -- ;
7711
7710
/* 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 ));
7715
7713
if (rc )
7716
7714
return rc ;
7717
7715
}
@@ -7728,7 +7726,6 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7728
7726
7729
7727
if (cdst -> mc_ki [cdst -> mc_top ] == 0 ) {
7730
7728
if (cdst -> mc_ki [cdst -> mc_top - 1 ] != 0 ) {
7731
- MDB_cursor dummy , * tracked ;
7732
7729
if (IS_LEAF2 (csrc -> mc_pg [csrc -> mc_top ])) {
7733
7730
key .mv_data = LEAF2KEY (cdst -> mc_pg [cdst -> mc_top ], 0 , key .mv_size );
7734
7731
} else {
@@ -7742,9 +7739,8 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7742
7739
mn .mc_snum -- ;
7743
7740
mn .mc_top -- ;
7744
7741
/* 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 ));
7748
7744
if (rc )
7749
7745
return rc ;
7750
7746
}
@@ -8103,13 +8099,11 @@ mdb_rebalance(MDB_cursor *mc)
8103
8099
if (!fromleft ) {
8104
8100
rc = mdb_page_merge (& mn , mc );
8105
8101
} else {
8106
- MDB_cursor dummy , * tracked ;
8107
8102
oldki += NUMKEYS (mn .mc_pg [mn .mc_top ]);
8108
8103
mn .mc_ki [mn .mc_top ] += mc -> mc_ki [mn .mc_top ] + 1 ;
8109
8104
/* 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 ));
8113
8107
mdb_cursor_copy (& mn , mc );
8114
8108
}
8115
8109
mc -> mc_flags &= ~C_EOF ;
@@ -8473,14 +8467,12 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
8473
8467
*/
8474
8468
if (SIZELEFT (mn .mc_pg [ptop ]) < mdb_branch_size (env , & sepkey )) {
8475
8469
int snum = mc -> mc_snum ;
8476
- MDB_cursor dummy , * tracked ;
8477
8470
mn .mc_snum -- ;
8478
8471
mn .mc_top -- ;
8479
8472
did_split = 1 ;
8480
8473
/* 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 ));
8484
8476
if (rc )
8485
8477
goto done ;
8486
8478
0 commit comments