Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
da2cfe8a
Commit
da2cfe8a
authored
Apr 01, 2010
by
Pieter Noordhuis
Browse files
update the zipmap entry in-place instead of appending it
parent
bfded2aa
Changes
1
Hide whitespace changes
Inline
Side-by-side
zipmap.c
View file @
da2cfe8a
...
...
@@ -208,7 +208,7 @@ static inline unsigned char *zipmapResize(unsigned char *zm, unsigned int len) {
* If 'update' is not NULL, *update is set to 1 if the key was
* already preset, otherwise to 0. */
unsigned
char
*
zipmapSet
(
unsigned
char
*
zm
,
unsigned
char
*
key
,
unsigned
int
klen
,
unsigned
char
*
val
,
unsigned
int
vlen
,
int
*
update
)
{
unsigned
int
zmlen
;
unsigned
int
zmlen
,
offset
;
unsigned
int
freelen
,
reqlen
=
zipmapRequiredLength
(
klen
,
vlen
);
unsigned
int
empty
,
vempty
;
unsigned
char
*
p
;
...
...
@@ -230,27 +230,34 @@ unsigned char *zipmapSet(unsigned char *zm, unsigned char *key, unsigned int kle
if
(
update
)
*
update
=
1
;
freelen
=
zipmapRawEntryLength
(
p
);
if
(
freelen
<
reqlen
)
{
/*
Move remaining entries to the current position, so this
*
pair
can be
appended. Note: the +1 in memmove is caused
*
by the end-of-zipmap byte
. */
memmove
(
p
,
p
+
freelen
,
zmlen
-
((
p
-
zm
)
+
freelen
+
1
))
;
/*
Store the offset of this key within the current zipmap, so
*
it
can be
resized. Then, move the tail backwards so this
*
pair fits at the current position
. */
offset
=
p
-
zm
;
zm
=
zipmapResize
(
zm
,
zmlen
-
freelen
+
reqlen
);
p
=
zm
+
zmlen
-
1
-
freelen
;
zmlen
=
zmlen
-
1
-
freelen
+
reqlen
;
p
=
zm
+
offset
;
/* The +1 in the number of bytes to be moved is caused by the
* end-of-zipmap byte. Note: the *original* zmlen is used. */
memmove
(
p
+
reqlen
,
p
+
freelen
,
zmlen
-
(
offset
+
freelen
+
1
));
zmlen
=
zmlen
-
freelen
+
reqlen
;
freelen
=
reqlen
;
}
}
/* Ok we have a suitable block where to write the new key/value
* entry. */
/* We now have a suitable block where the key/value entry can
* be written. If there is too much free space, move the tail
* of the zipmap a few bytes to the front and shrink the zipmap,
* as we want zipmaps to be very space efficient. */
empty
=
freelen
-
reqlen
;
/* If there is too much free space mark it as a free block instead
* of adding it as trailing empty space for the value, as we want
* zipmaps to be very space efficient. */
if
(
empty
>=
ZIPMAP_VALUE_MAX_FREE
)
{
memmove
(
p
+
reqlen
,
p
+
freelen
,
zmlen
-
((
p
-
zm
)
+
freelen
+
1
));
/* First, move the tail <empty> bytes to the front, then resize
* the zipmap to be <empty> bytes smaller. */
offset
=
p
-
zm
;
memmove
(
p
+
reqlen
,
p
+
freelen
,
zmlen
-
(
offset
+
freelen
+
1
));
zmlen
-=
empty
;
zm
=
zipmapResize
(
zm
,
zmlen
);
p
=
zm
+
offset
;
vempty
=
0
;
}
else
{
vempty
=
empty
;
...
...
Write
Preview
Markdown
is supported
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