Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hanoi2005
redis
提交
f1017b3f
R
redis
项目概览
hanoi2005
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
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,发现更多精彩内容 >>
提交
f1017b3f
编写于
10月 07, 2009
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
undoed all the sds hacking that lead just to random bugs and no memory saving ;)
上级
e8a74421
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
40 addition
and
110 deletion
+40
-110
redis.c
redis.c
+6
-6
sds.c
sds.c
+32
-100
sds.h
sds.h
+2
-4
未找到文件。
redis.c
浏览文件 @
f1017b3f
...
...
@@ -3623,9 +3623,8 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
int
prefixlen
,
sublen
,
postfixlen
;
/* Expoit the internal sds representation to create a sds string allocated on the stack in order to make this function faster */
struct
{
int
len
;
unsigned
short
free
;
unsigned
short
_len
;
/* not used here */
long
len
;
long
free
;
char
buf
[
REDIS_SORTKEY_MAX
+
1
];
}
keyname
;
...
...
@@ -3649,7 +3648,6 @@ static robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
memcpy
(
keyname
.
buf
+
prefixlen
+
sublen
,
p
+
1
,
postfixlen
);
keyname
.
buf
[
prefixlen
+
sublen
+
postfixlen
]
=
'\0'
;
keyname
.
len
=
prefixlen
+
sublen
+
postfixlen
;
keyname
.
_len
=
USHRT_MAX
;
keyobj
.
refcount
=
1
;
keyobj
.
type
=
REDIS_STRING
;
...
...
@@ -3847,9 +3845,9 @@ static void sortCommand(redisClient *c) {
if
(
byval
->
encoding
==
REDIS_ENCODING_RAW
)
{
vector
[
j
].
u
.
score
=
strtod
(
byval
->
ptr
,
NULL
);
}
else
{
if
(
byval
->
encoding
==
REDIS_ENCODING_INT
)
if
(
byval
->
encoding
==
REDIS_ENCODING_INT
)
{
vector
[
j
].
u
.
score
=
(
long
)
byval
->
ptr
;
else
}
else
assert
(
1
!=
1
);
}
}
...
...
@@ -3936,6 +3934,7 @@ static void infoCommand(redisClient *c) {
info
=
sdscatprintf
(
sdsempty
(),
"redis_version:%s
\r\n
"
"arch_bits:%s
\r\n
"
"uptime_in_seconds:%d
\r\n
"
"uptime_in_days:%d
\r\n
"
"connected_clients:%d
\r\n
"
...
...
@@ -3948,6 +3947,7 @@ static void infoCommand(redisClient *c) {
"total_commands_processed:%lld
\r\n
"
"role:%s
\r\n
"
,
REDIS_VERSION
,
(
sizeof
(
long
)
==
8
)
?
"64"
:
"32"
,
uptime
,
uptime
/
(
3600
*
24
),
listLength
(
server
.
clients
)
-
listLength
(
server
.
slaves
),
...
...
sds.c
浏览文件 @
f1017b3f
...
...
@@ -28,8 +28,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
/* TODO: check if it can happen that _len+free > USHRT_MAX */
#define SDS_ABORT_ON_OOM
#include "sds.h"
...
...
@@ -48,25 +46,13 @@ static void sdsOomAbort(void) {
sds
sdsnewlen
(
const
void
*
init
,
size_t
initlen
)
{
struct
sdshdr
*
sh
;
if
(
initlen
>=
USHRT_MAX
)
{
sh
=
zmalloc
(
sizeof
(
struct
sdshdr
)
+
initlen
+
1
);
sh
->
len
=
initlen
;
sh
->
_len
=
USHRT_MAX
;
#ifdef SDS_ABORT_ON_OOM
if
(
sh
==
NULL
)
sdsOomAbort
();
#else
if
(
sh
==
NULL
)
return
NULL
;
#endif
}
else
{
sh
=
zmalloc
(
sizeof
(
int
)
+
initlen
+
1
);
sh
=
(
struct
sdshdr
*
)
(((
char
*
)
sh
)
-
sizeof
(
int
));
#ifdef SDS_ABORT_ON_OOM
if
(
sh
==
NULL
)
sdsOomAbort
();
#else
if
(
sh
==
NULL
)
return
NULL
;
#endif
sh
->
_len
=
initlen
;
}
sh
=
zmalloc
(
sizeof
(
struct
sdshdr
)
+
initlen
+
1
);
#ifdef SDS_ABORT_ON_OOM
if
(
sh
==
NULL
)
sdsOomAbort
();
#else
if
(
sh
==
NULL
)
return
NULL
;
#endif
sh
->
len
=
initlen
;
sh
->
free
=
0
;
if
(
initlen
)
{
if
(
init
)
memcpy
(
sh
->
buf
,
init
,
initlen
);
...
...
@@ -87,10 +73,7 @@ sds sdsnew(const char *init) {
size_t
sdslen
(
const
sds
s
)
{
struct
sdshdr
*
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
if
(
sh
->
_len
==
USHRT_MAX
)
return
sh
->
len
;
else
return
sh
->
_len
;
return
sh
->
len
;
}
sds
sdsdup
(
const
sds
s
)
{
...
...
@@ -98,14 +81,8 @@ sds sdsdup(const sds s) {
}
void
sdsfree
(
sds
s
)
{
struct
sdshdr
*
sh
;
if
(
s
==
NULL
)
return
;
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
if
(
sh
->
_len
==
USHRT_MAX
)
zfree
(
s
-
sizeof
(
struct
sdshdr
));
else
zfree
(
s
-
sizeof
(
struct
sdshdr
)
+
sizeof
(
int
));
zfree
(
s
-
sizeof
(
struct
sdshdr
));
}
size_t
sdsavail
(
sds
s
)
{
...
...
@@ -116,73 +93,40 @@ size_t sdsavail(sds s) {
void
sdsupdatelen
(
sds
s
)
{
struct
sdshdr
*
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
int
reallen
=
strlen
(
s
);
if
(
sh
->
_len
==
USHRT_MAX
)
{
sh
->
free
+=
(
sh
->
len
-
reallen
);
sh
->
len
=
reallen
;
}
else
{
sh
->
free
+=
(
sh
->
_len
-
reallen
);
sh
->
_len
=
reallen
;
}
sh
->
free
+=
(
sh
->
len
-
reallen
);
sh
->
len
=
reallen
;
}
static
sds
sdsMakeRoomFor
(
sds
s
,
size_t
addlen
)
{
struct
sdshdr
*
sh
,
*
newsh
;
size_t
free
=
sdsavail
(
s
);
size_t
len
,
newlen
,
newfree
;
size_t
len
,
newlen
;
if
(
free
>=
addlen
)
{
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
if
(
sh
->
_len
==
USHRT_MAX
)
{
sh
->
len
+=
addlen
;
}
else
{
sh
->
_len
+=
addlen
;
}
sh
->
free
-=
addlen
;
return
s
;
}
if
(
free
>=
addlen
)
return
s
;
len
=
sdslen
(
s
);
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
newlen
=
(
len
+
addlen
);
newfree
=
((
addlen
*
2
)
>
USHRT_MAX
)
?
USHRT_MAX
:
(
addlen
*
2
);
if
(
newlen
+
newfree
>=
USHRT_MAX
||
sh
->
_len
==
USHRT_MAX
)
{
if
(
sh
->
_len
==
USHRT_MAX
)
{
newsh
=
zrealloc
(
sh
,
sizeof
(
struct
sdshdr
)
+
newlen
+
1
+
newfree
);
}
else
{
newsh
=
zmalloc
(
sizeof
(
struct
sdshdr
)
+
newlen
+
1
+
newfree
);
if
(
!
newsh
)
return
NULL
;
memcpy
(
newsh
->
buf
,
sh
->
buf
,
len
);
newsh
->
buf
[
len
]
=
'\0'
;
zfree
(((
char
*
)
sh
)
+
sizeof
(
int
));
}
newlen
=
(
len
+
addlen
)
*
2
;
newsh
=
zrealloc
(
sh
,
sizeof
(
struct
sdshdr
)
+
newlen
+
1
);
#ifdef SDS_ABORT_ON_OOM
if
(
newsh
==
NULL
)
sdsOomAbort
();
if
(
newsh
==
NULL
)
sdsOomAbort
();
#else
if
(
newsh
==
NULL
)
return
NULL
;
if
(
newsh
==
NULL
)
return
NULL
;
#endif
newsh
->
_len
=
USHRT_MAX
;
newsh
->
free
=
newfree
;
newsh
->
len
=
newlen
;
}
else
{
newsh
=
zrealloc
(((
char
*
)
sh
)
+
sizeof
(
int
),
sizeof
(
int
)
+
newlen
+
1
+
newfree
);
newsh
=
(
struct
sdshdr
*
)
(((
char
*
)
newsh
)
-
sizeof
(
int
));
#ifdef SDS_ABORT_ON_OOM
if
(
newsh
==
NULL
)
sdsOomAbort
();
#else
if
(
newsh
==
NULL
)
return
NULL
;
#endif
newsh
->
_len
=
newlen
;
newsh
->
free
=
newfree
;
}
newsh
->
free
=
newlen
-
len
;
return
newsh
->
buf
;
}
sds
sdscatlen
(
sds
s
,
void
*
t
,
size_t
len
)
{
struct
sdshdr
*
sh
;
size_t
curlen
=
sdslen
(
s
);
s
=
sdsMakeRoomFor
(
s
,
len
);
if
(
s
==
NULL
)
return
NULL
;
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
memcpy
(
s
+
curlen
,
t
,
len
);
sh
->
len
=
curlen
+
len
;
sh
->
free
=
sh
->
free
-
len
;
s
[
curlen
+
len
]
=
'\0'
;
return
s
;
}
...
...
@@ -193,20 +137,18 @@ sds sdscat(sds s, char *t) {
sds
sdscpylen
(
sds
s
,
char
*
t
,
size_t
len
)
{
struct
sdshdr
*
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
size_t
totlen
;
if
(
sh
->
_len
==
USHRT_MAX
)
{
totlen
=
sh
->
free
+
sh
->
len
;
}
else
{
totlen
=
sh
->
free
+
sh
->
_len
;
}
size_t
totlen
=
sh
->
free
+
sh
->
len
;
if
(
totlen
<
len
)
{
s
=
sdsMakeRoomFor
(
s
,
len
-
totlen
);
if
(
s
==
NULL
)
return
NULL
;
sh
=
(
void
*
)
(
s
-
(
sizeof
(
struct
sdshdr
)));
totlen
=
sh
->
free
+
sh
->
len
;
}
memcpy
(
s
,
t
,
len
);
s
[
len
]
=
'\0'
;
sh
->
len
=
len
;
sh
->
free
=
totlen
-
len
;
return
s
;
}
...
...
@@ -254,13 +196,8 @@ sds sdstrim(sds s, const char *cset) {
len
=
(
sp
>
ep
)
?
0
:
((
ep
-
sp
)
+
1
);
if
(
sh
->
buf
!=
sp
)
memmove
(
sh
->
buf
,
sp
,
len
);
sh
->
buf
[
len
]
=
'\0'
;
if
(
sh
->
_len
==
USHRT_MAX
)
{
sh
->
free
=
sh
->
free
+
(
sh
->
len
-
len
);
sh
->
len
=
len
;
}
else
{
sh
->
free
=
sh
->
free
+
(
sh
->
_len
-
len
);
sh
->
_len
=
len
;
}
sh
->
free
=
sh
->
free
+
(
sh
->
len
-
len
);
sh
->
len
=
len
;
return
s
;
}
...
...
@@ -287,13 +224,8 @@ sds sdsrange(sds s, long start, long end) {
}
if
(
start
!=
0
)
memmove
(
sh
->
buf
,
sh
->
buf
+
start
,
newlen
);
sh
->
buf
[
newlen
]
=
0
;
if
(
sh
->
_len
==
USHRT_MAX
)
{
sh
->
free
=
sh
->
free
+
(
sh
->
len
-
newlen
);
sh
->
len
=
newlen
;
}
else
{
sh
->
free
=
sh
->
free
+
(
sh
->
_len
-
newlen
);
sh
->
_len
=
newlen
;
}
sh
->
free
=
sh
->
free
+
(
sh
->
len
-
newlen
);
sh
->
len
=
newlen
;
return
s
;
}
...
...
sds.h
浏览文件 @
f1017b3f
...
...
@@ -32,14 +32,12 @@
#define __SDS_H
#include <sys/types.h>
#include <limits.h>
typedef
char
*
sds
;
struct
sdshdr
{
int
len
;
unsigned
short
free
;
unsigned
short
_len
;
/* USHRT_MAX if it is a "long" sds string */
long
len
;
long
free
;
char
buf
[];
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录