Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
HAMANO Tsukasa
OpenLDAP
Commits
2baadabd
Commit
2baadabd
authored
Mar 09, 2012
by
Hallvard Furuseth
Browse files
ITS#7191 Align dirty MDB pages on the stack
parent
15f3e650
Changes
1
Hide whitespace changes
Inline
Side-by-side
libraries/libmdb/mdb.c
View file @
2baadabd
...
...
@@ -764,6 +764,20 @@ typedef struct MDB_meta {
txnid_t
mm_txnid
;
/**< txnid that committed this page */
}
MDB_meta
;
/** Buffer for a stack-allocated dirty page.
* The members define size and alignment, and silence type
* aliasing warnings. They are not used directly; that could
* mean incorrectly using several union members in parallel.
*/
typedef
union
MDB_pagebuf
{
char
mb_raw
[
MDB_PAGESIZE
];
MDB_page
mb_page
;
struct
{
char
mm_pad
[
PAGEHDRSZ
];
MDB_meta
mm_meta
;
}
mb_metabuf
;
}
MDB_pagebuf
;
/** Auxiliary DB info.
* The information here is mostly static/read-only. There is
* only a single copy of this record in the environment.
...
...
@@ -2050,7 +2064,7 @@ done:
static
int
mdb_env_read_header
(
MDB_env
*
env
,
MDB_meta
*
meta
)
{
char
page
[
MDB_PAGESIZE
]
;
MDB_pagebuf
pbuf
;
MDB_page
*
p
;
MDB_meta
*
m
;
int
rc
,
err
;
...
...
@@ -2059,9 +2073,9 @@ mdb_env_read_header(MDB_env *env, MDB_meta *meta)
*/
#ifdef _WIN32
if
(
!
ReadFile
(
env
->
me_fd
,
page
,
MDB_PAGESIZE
,
(
DWORD
*
)
&
rc
,
NULL
)
||
rc
==
0
)
if
(
!
ReadFile
(
env
->
me_fd
,
&
pbuf
,
MDB_PAGESIZE
,
(
DWORD
*
)
&
rc
,
NULL
)
||
rc
==
0
)
#else
if
((
rc
=
read
(
env
->
me_fd
,
page
,
MDB_PAGESIZE
))
==
0
)
if
((
rc
=
read
(
env
->
me_fd
,
&
pbuf
,
MDB_PAGESIZE
))
==
0
)
#endif
{
return
ENOENT
;
...
...
@@ -2074,7 +2088,7 @@ mdb_env_read_header(MDB_env *env, MDB_meta *meta)
return
err
;
}
p
=
(
MDB_page
*
)
page
;
p
=
(
MDB_page
*
)
&
pbuf
;
if
(
!
F_ISSET
(
p
->
mp_flags
,
P_META
))
{
DPRINTF
(
"page %zu not a meta page"
,
p
->
mp_pgno
);
...
...
@@ -3996,7 +4010,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
unsigned
int
mcount
=
0
;
size_t
nsize
;
int
rc
,
rc2
;
char
pbuf
[
MDB_PAGESIZE
]
;
MDB_pagebuf
pbuf
;
char
dbuf
[
MAXKEYSIZE
+
1
];
unsigned
int
nflags
;
DKBUF
;
...
...
@@ -4092,7 +4106,7 @@ more:
/* create a fake page for the dup items */
memcpy
(
dbuf
,
dkey
.
mv_data
,
dkey
.
mv_size
);
dkey
.
mv_data
=
dbuf
;
fp
=
(
MDB_page
*
)
pbuf
;
fp
=
(
MDB_page
*
)
&
pbuf
;
fp
->
mp_pgno
=
mc
->
mc_pg
[
mc
->
mc_top
]
->
mp_pgno
;
fp
->
mp_flags
=
P_LEAF
|
P_DIRTY
|
P_SUBP
;
fp
->
mp_lower
=
PAGEHDRSZ
;
...
...
@@ -4108,7 +4122,7 @@ more:
do_sub
=
1
;
rdata
=
&
xdata
;
xdata
.
mv_size
=
fp
->
mp_upper
;
xdata
.
mv_data
=
pbu
f
;
xdata
.
mv_data
=
f
p
;
flags
|=
F_DUPDATA
;
goto
new_sub
;
}
...
...
@@ -4161,8 +4175,8 @@ more:
/* no, just grow it */
rdata
=
&
xdata
;
xdata
.
mv_size
=
NODEDSZ
(
leaf
)
+
offset
;
xdata
.
mv_data
=
pbuf
;
mp
=
(
MDB_page
*
)
pbuf
;
xdata
.
mv_data
=
&
pbuf
;
mp
=
(
MDB_page
*
)
&
pbuf
;
mp
->
mp_pgno
=
mc
->
mc_pg
[
mc
->
mc_top
]
->
mp_pgno
;
flags
|=
F_DUPDATA
;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a 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