Commit fcb0d095 authored by Hallvard Furuseth's avatar Hallvard Furuseth
Browse files

Add EVEN(): Micro-optimize "up to multiple of 2".

parent 753356a3
......@@ -428,6 +428,9 @@ static txnid_t mdb_debug_start;
/** Test if the flags \b f are set in a flag word \b w. */
#define F_ISSET(w, f) (((w) & (f)) == (f))
/** Round \b n up to an even number. */
#define EVEN(n) (((n) + 1U) & -2) /* sign-extending -2 to match n+1U */
/** Used for offsets within a single page.
* Since memory pages are typically 4 or 8KB in size, 12-13 bits,
* this is plenty.
......@@ -1246,7 +1249,7 @@ mdb_page_list(MDB_page *mp)
nsize += sizeof(indx_t);
fprintf(stderr, "key %d: nsize %d, %s\n", i, nsize, DKEY(&key));
}
total += (total & 1);
total = EVEN(total);
}
fprintf(stderr, "Total: %d\n", total);
}
......@@ -5870,8 +5873,8 @@ more:
switch (flags) {
default:
if (!(mc->mc_db->md_flags & MDB_DUPFIXED)) {
offset = NODESIZE + sizeof(indx_t) + data->mv_size;
offset += offset & 1;
offset = EVEN(NODESIZE + sizeof(indx_t) +
data->mv_size);
break;
}
offset = fp->mp_pad;
......@@ -6255,9 +6258,8 @@ mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data)
/* put on overflow page */
sz -= data->mv_size - sizeof(pgno_t);
}
sz += sz & 1;
return sz + sizeof(indx_t);
return EVEN(sz + sizeof(indx_t));
}
/** Calculate the size of a branch node.
......@@ -6351,7 +6353,7 @@ mdb_node_add(MDB_cursor *mc, indx_t indx,
/* Put data on overflow page. */
DPRINTF(("data size is %"Z"u, node would be %"Z"u, put data on overflow page",
data->mv_size, node_size+data->mv_size));
node_size += sizeof(pgno_t) + (node_size & 1);
node_size = EVEN(node_size + sizeof(pgno_t));
if ((ssize_t)node_size > room)
goto full;
if ((rc = mdb_page_new(mc, P_OVERFLOW, ovpages, &ofp)))
......@@ -6363,7 +6365,7 @@ mdb_node_add(MDB_cursor *mc, indx_t indx,
node_size += data->mv_size;
}
}
node_size += node_size & 1;
node_size = EVEN(node_size);
if ((ssize_t)node_size > room)
goto full;
......@@ -6464,7 +6466,7 @@ mdb_node_del(MDB_page *mp, indx_t indx, int ksize)
else
sz += NODEDSZ(node);
}
sz += sz & 1;
sz = EVEN(sz);
ptr = mp->mp_ptrs[indx];
numkeys = NUMKEYS(mp);
......@@ -6779,15 +6781,12 @@ mdb_update_key(MDB_cursor *mc, MDB_val *key)
}
#endif
ksize = key->mv_size;
ksize += (ksize & 1);
oksize = node->mn_ksize;
oksize += (oksize & 1);
/* Sizes must be 2-byte aligned. */
ksize = EVEN(key->mv_size);
oksize = EVEN(node->mn_ksize);
delta = ksize - oksize;
/* Must be 2-byte aligned. If new key is
* shorter by 1, the shift will be skipped.
*/
/* Shift node contents if EVEN(key length) changed. */
if (delta) {
if (delta > 0 && SIZELEFT(mp) < delta) {
pgno_t pgno;
......@@ -7565,7 +7564,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
nsize = mdb_leaf_size(env, newkey, newdata);
else
nsize = mdb_branch_size(env, newkey);
nsize += nsize & 1;
nsize = EVEN(nsize);
/* grab a page to hold a temporary copy */
copy = mdb_page_malloc(mc->mc_txn, 1);
......@@ -7622,7 +7621,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
else
psize += NODEDSZ(node);
}
psize += psize & 1;
psize = EVEN(psize);
}
if (psize > pmax || i == k-j) {
split_indx = i + (j<0);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment