Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
b1a6a589
Commit
b1a6a589
authored
Jan 22, 2014
by
Xiaojie Zhang
Committed by
antirez
Aug 26, 2014
Browse files
Avoid unnecessary decoding in ziplist.c
Closes #1519
parent
61ce627f
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/ziplist.c
View file @
b1a6a589
...
...
@@ -576,19 +576,19 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
/* Insert item at "p". */
static
unsigned
char
*
__ziplistInsert
(
unsigned
char
*
zl
,
unsigned
char
*
p
,
unsigned
char
*
s
,
unsigned
int
slen
)
{
size_t
curlen
=
intrev32ifbe
(
ZIPLIST_BYTES
(
zl
)),
reqlen
,
prevlen
=
0
;
size_t
curlen
=
intrev32ifbe
(
ZIPLIST_BYTES
(
zl
)),
reqlen
;
unsigned
int
prevlensize
,
prevlen
=
0
;
size_t
offset
;
int
nextdiff
=
0
;
unsigned
char
encoding
=
0
;
long
long
value
=
123456789
;
/* initialized to avoid warning. Using a value
that is easy to see if for some reason
we use it uninitialized. */
zlentry
entry
,
tail
;
zlentry
tail
;
/* Find out prevlen for the entry that is inserted. */
if
(
p
[
0
]
!=
ZIP_END
)
{
entry
=
zipEntry
(
p
);
prevlen
=
entry
.
prevrawlen
;
ZIP_DECODE_PREVLEN
(
p
,
prevlensize
,
prevlen
);
}
else
{
unsigned
char
*
ptail
=
ZIPLIST_ENTRY_TAIL
(
zl
);
if
(
ptail
[
0
]
!=
ZIP_END
)
{
...
...
@@ -676,15 +676,15 @@ unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int sle
* doesn't contain an element at the provided index, NULL is returned. */
unsigned
char
*
ziplistIndex
(
unsigned
char
*
zl
,
int
index
)
{
unsigned
char
*
p
;
zlentry
entry
;
unsigned
int
prevlensize
,
prevlen
=
0
;
if
(
index
<
0
)
{
index
=
(
-
index
)
-
1
;
p
=
ZIPLIST_ENTRY_TAIL
(
zl
);
if
(
p
[
0
]
!=
ZIP_END
)
{
entry
=
zipEntry
(
p
);
while
(
entry
.
prev
raw
len
>
0
&&
index
--
)
{
p
-=
entry
.
prev
raw
len
;
entry
=
zipEntry
(
p
);
ZIP_DECODE_PREVLEN
(
p
,
prevlensize
,
prevlen
);
while
(
prevlen
>
0
&&
index
--
)
{
p
-=
prevlen
;
ZIP_DECODE_PREVLEN
(
p
,
prevlensize
,
prevlen
);
}
}
}
else
{
...
...
@@ -722,7 +722,7 @@ unsigned char *ziplistNext(unsigned char *zl, unsigned char *p) {
/* Return pointer to previous entry in ziplist. */
unsigned
char
*
ziplistPrev
(
unsigned
char
*
zl
,
unsigned
char
*
p
)
{
zlentry
entry
;
unsigned
int
prevlensize
,
prevlen
=
0
;
/* Iterating backwards from ZIP_END should return the tail. When "p" is
* equal to the first element of the list, we're already at the head,
...
...
@@ -733,9 +733,9 @@ unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p) {
}
else
if
(
p
==
ZIPLIST_ENTRY_HEAD
(
zl
))
{
return
NULL
;
}
else
{
entry
=
zipEntry
(
p
);
assert
(
entry
.
prev
raw
len
>
0
);
return
p
-
entry
.
prev
raw
len
;
ZIP_DECODE_PREVLEN
(
p
,
prevlensize
,
prevlen
);
assert
(
prevlen
>
0
);
return
p
-
prevlen
;
}
}
...
...
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