Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
HAMANO Tsukasa
OpenLDAP
Commits
fcb0d095
Commit
fcb0d095
authored
Dec 11, 2013
by
Hallvard Furuseth
Browse files
Add EVEN(): Micro-optimize "up to multiple of 2".
parent
753356a3
Changes
1
Hide whitespace changes
Inline
Side-by-side
libraries/liblmdb/mdb.c
View file @
fcb0d095
...
...
@@ -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
);
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment