Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
724371d7
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
724371d7
编写于
8月 22, 2012
作者:
S
Salvatore Sanfilippo
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #628 from pietern/unstable-zip
Fix ziplist edge case
上级
227b4293
3cc2904e
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
61 addition
and
7 deletion
+61
-7
src/ziplist.c
src/ziplist.c
+61
-7
未找到文件。
src/ziplist.c
浏览文件 @
724371d7
...
...
@@ -500,12 +500,13 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
totlen
=
p
-
first
.
p
;
if
(
totlen
>
0
)
{
if
(
p
[
0
]
!=
ZIP_END
)
{
/*
Tricky: storing the prevlen in this entry might reduce or
*
increase the number of bytes needed, compared to the current
*
prevlen. Note that we can always store this length because
*
it was previously stored by an entry that is
being deleted. */
/*
Storing `prevrawlen` in this entry may increase or decrease the
*
number of bytes required compare to the current `prevrawlen`.
*
There always is room to store this, because it was previously
*
stored by an entry that is now
being deleted. */
nextdiff
=
zipPrevLenByteDiff
(
p
,
first
.
prevrawlen
);
zipPrevEncodeLength
(
p
-
nextdiff
,
first
.
prevrawlen
);
p
-=
nextdiff
;
zipPrevEncodeLength
(
p
,
first
.
prevrawlen
);
/* Update offset for tail */
ZIPLIST_TAIL_OFFSET
(
zl
)
=
...
...
@@ -521,8 +522,8 @@ static unsigned char *__ziplistDelete(unsigned char *zl, unsigned char *p, unsig
}
/* Move tail to the front of the ziplist */
memmove
(
first
.
p
,
p
-
nextdiff
,
intrev32ifbe
(
ZIPLIST_BYTES
(
zl
))
-
(
p
-
zl
)
-
1
+
nextdiff
);
memmove
(
first
.
p
,
p
,
intrev32ifbe
(
ZIPLIST_BYTES
(
zl
))
-
(
p
-
zl
)
-
1
);
}
else
{
/* The entire tail was deleted. No need to move memory. */
ZIPLIST_TAIL_OFFSET
(
zl
)
=
...
...
@@ -1034,6 +1035,22 @@ int randstring(char *target, unsigned int min, unsigned int max) {
return
len
;
}
void
verify
(
unsigned
char
*
zl
,
zlentry
*
e
)
{
int
i
;
int
len
=
ziplistLen
(
zl
);
zlentry
_e
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
memset
(
&
e
[
i
],
0
,
sizeof
(
zlentry
));
e
[
i
]
=
zipEntry
(
ziplistIndex
(
zl
,
i
));
memset
(
&
_e
,
0
,
sizeof
(
zlentry
));
_e
=
zipEntry
(
ziplistIndex
(
zl
,
-
len
+
i
));
assert
(
memcmp
(
&
e
[
i
],
&
_e
,
sizeof
(
zlentry
))
==
0
);
}
}
int
main
(
int
argc
,
char
**
argv
)
{
unsigned
char
*
zl
,
*
p
;
unsigned
char
*
entry
;
...
...
@@ -1315,6 +1332,43 @@ int main(int argc, char **argv) {
printf
(
"SUCCESS
\n\n
"
);
}
printf
(
"Regression test deleting next to last entries:
\n
"
);
{
char
v
[
3
][
257
];
zlentry
e
[
3
];
int
i
;
for
(
i
=
0
;
i
<
(
sizeof
(
v
)
/
sizeof
(
v
[
0
]));
i
++
)
{
memset
(
v
[
i
],
'a'
+
i
,
sizeof
(
v
[
0
]));
}
v
[
0
][
256
]
=
'\0'
;
v
[
1
][
1
]
=
'\0'
;
v
[
2
][
256
]
=
'\0'
;
zl
=
ziplistNew
();
for
(
i
=
0
;
i
<
(
sizeof
(
v
)
/
sizeof
(
v
[
0
]));
i
++
)
{
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
v
[
i
],
strlen
(
v
[
i
]),
ZIPLIST_TAIL
);
}
verify
(
zl
,
e
);
assert
(
e
[
0
].
prevrawlensize
==
1
);
assert
(
e
[
1
].
prevrawlensize
==
5
);
assert
(
e
[
2
].
prevrawlensize
==
1
);
/* Deleting entry 1 will increase `prevrawlensize` for entry 2 */
unsigned
char
*
p
=
e
[
1
].
p
;
zl
=
ziplistDelete
(
zl
,
&
p
);
verify
(
zl
,
e
);
assert
(
e
[
0
].
prevrawlensize
==
1
);
assert
(
e
[
1
].
prevrawlensize
==
5
);
printf
(
"SUCCESS
\n\n
"
);
}
printf
(
"Create long list and check indices:
\n
"
);
{
zl
=
ziplistNew
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录