Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
50e50d6a
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,体验更适合开发者的 AI 搜索 >>
提交
50e50d6a
编写于
5月 05, 2011
作者:
P
Pieter Noordhuis
提交者:
antirez
5月 05, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix ziplist regression and update stresser
上级
9d665825
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
31 deletion
+34
-31
src/ziplist.c
src/ziplist.c
+34
-31
未找到文件。
src/ziplist.c
浏览文件 @
50e50d6a
...
...
@@ -398,12 +398,17 @@ static unsigned char *__ziplistCascadeUpdate(unsigned char *zl, unsigned char *p
offset
=
p
-
zl
;
extra
=
rawlensize
-
next
.
prevrawlensize
;
zl
=
ziplistResize
(
zl
,
curlen
+
extra
);
ZIPLIST_TAIL_OFFSET
(
zl
)
+=
extra
;
p
=
zl
+
offset
;
/*
Move the tail to the back
. */
/*
Current pointer and offset for next element
. */
np
=
p
+
rawlen
;
noffset
=
np
-
zl
;
/* Update tail offset when next element is not the tail element. */
if
((
zl
+
ZIPLIST_TAIL_OFFSET
(
zl
))
!=
np
)
ZIPLIST_TAIL_OFFSET
(
zl
)
+=
extra
;
/* Move the tail to the back. */
memmove
(
np
+
rawlensize
,
np
+
next
.
prevrawlensize
,
curlen
-
noffset
-
next
.
prevrawlensize
-
1
);
...
...
@@ -877,7 +882,7 @@ void pop(unsigned char *zl, int where) {
}
}
void
randstring
(
char
*
target
,
unsigned
int
min
,
unsigned
int
max
)
{
int
randstring
(
char
*
target
,
unsigned
int
min
,
unsigned
int
max
)
{
int
p
,
len
=
min
+
rand
()
%
(
max
-
min
+
1
);
int
minval
,
maxval
;
switch
(
rand
()
%
3
)
{
...
...
@@ -899,10 +904,9 @@ void randstring(char *target, unsigned int min, unsigned int max) {
while
(
p
<
len
)
target
[
p
++
]
=
minval
+
rand
()
%
(
maxval
-
minval
+
1
);
return
;
return
len
;
}
int
main
(
int
argc
,
char
**
argv
)
{
unsigned
char
*
zl
,
*
p
;
unsigned
char
*
entry
;
...
...
@@ -1235,6 +1239,7 @@ int main(int argc, char **argv) {
int
i
,
j
,
len
,
where
;
unsigned
char
*
p
;
char
buf
[
1024
];
int
buflen
;
list
*
ref
;
listNode
*
refnode
;
...
...
@@ -1243,10 +1248,6 @@ int main(int argc, char **argv) {
unsigned
int
slen
;
long
long
sval
;
/* In the regression for the cascade bug, it was triggered
* with a random seed of 2. */
srand
(
2
);
for
(
i
=
0
;
i
<
20000
;
i
++
)
{
zl
=
ziplistNew
();
ref
=
listCreate
();
...
...
@@ -1256,31 +1257,32 @@ int main(int argc, char **argv) {
/* Create lists */
for
(
j
=
0
;
j
<
len
;
j
++
)
{
where
=
(
rand
()
&
1
)
?
ZIPLIST_HEAD
:
ZIPLIST_TAIL
;
switch
(
rand
()
%
4
)
{
case
0
:
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
>>
20
);
break
;
case
1
:
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
()));
break
;
case
2
:
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
<<
20
);
break
;
case
3
:
randstring
(
buf
,
0
,
256
);
break
;
default:
assert
(
NULL
);
if
(
rand
()
%
2
)
{
buflen
=
randstring
(
buf
,
1
,
sizeof
(
buf
)
-
1
);
}
else
{
switch
(
rand
()
%
3
)
{
case
0
:
buflen
=
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
>>
20
);
break
;
case
1
:
buflen
=
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
()));
break
;
case
2
:
buflen
=
sprintf
(
buf
,
"%lld"
,(
0LL
+
rand
())
<<
20
);
break
;
default:
assert
(
NULL
);
}
}
/* Add to ziplist */
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
buf
,
strlen
(
buf
)
,
where
);
zl
=
ziplistPush
(
zl
,
(
unsigned
char
*
)
buf
,
buflen
,
where
);
/* Add to reference list */
if
(
where
==
ZIPLIST_HEAD
)
{
listAddNodeHead
(
ref
,
sdsnew
(
buf
));
listAddNodeHead
(
ref
,
sdsnew
len
(
buf
,
buflen
));
}
else
if
(
where
==
ZIPLIST_TAIL
)
{
listAddNodeTail
(
ref
,
sdsnew
(
buf
));
listAddNodeTail
(
ref
,
sdsnew
len
(
buf
,
buflen
));
}
else
{
assert
(
NULL
);
}
...
...
@@ -1295,12 +1297,13 @@ int main(int argc, char **argv) {
assert
(
ziplistGet
(
p
,
&
sstr
,
&
slen
,
&
sval
));
if
(
sstr
==
NULL
)
{
sprintf
(
buf
,
"%lld"
,
sval
);
buflen
=
sprintf
(
buf
,
"%lld"
,
sval
);
}
else
{
memcpy
(
buf
,
sstr
,
slen
);
buf
[
slen
]
=
'\0'
;
buflen
=
slen
;
memcpy
(
buf
,
sstr
,
buflen
);
buf
[
buflen
]
=
'\0'
;
}
assert
(
strcmp
(
buf
,
listNodeValue
(
refnode
)
)
==
0
);
assert
(
memcmp
(
buf
,
listNodeValue
(
refnode
),
buflen
)
==
0
);
}
zfree
(
zl
);
listRelease
(
ref
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录