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
a50ea45c
Commit
a50ea45c
authored
Mar 04, 2010
by
Pieter Noordhuis
Browse files
merged memory reduction patch
parents
edb51958
2b37892e
Changes
1
Hide whitespace changes
Inline
Side-by-side
redis.c
View file @
a50ea45c
...
@@ -4844,7 +4844,8 @@ static zskiplistNode *zslCreateNode(int level, double score, robj *obj) {
...
@@ -4844,7 +4844,8 @@ static zskiplistNode *zslCreateNode(int level, double score, robj *obj) {
zskiplistNode
*
zn
=
zmalloc
(
sizeof
(
*
zn
));
zskiplistNode
*
zn
=
zmalloc
(
sizeof
(
*
zn
));
zn
->
forward
=
zmalloc
(
sizeof
(
zskiplistNode
*
)
*
level
);
zn
->
forward
=
zmalloc
(
sizeof
(
zskiplistNode
*
)
*
level
);
zn
->
span
=
zmalloc
(
sizeof
(
unsigned
int
)
*
level
);
if
(
level
>
0
)
zn
->
span
=
zmalloc
(
sizeof
(
unsigned
int
)
*
(
level
-
1
));
zn
->
score
=
score
;
zn
->
score
=
score
;
zn
->
obj
=
obj
;
zn
->
obj
=
obj
;
return
zn
;
return
zn
;
...
@@ -4897,19 +4898,19 @@ static int zslRandomLevel(void) {
...
@@ -4897,19 +4898,19 @@ static int zslRandomLevel(void) {
static
void
zslInsert
(
zskiplist
*
zsl
,
double
score
,
robj
*
obj
)
{
static
void
zslInsert
(
zskiplist
*
zsl
,
double
score
,
robj
*
obj
)
{
zskiplistNode
*
update
[
ZSKIPLIST_MAXLEVEL
],
*
x
;
zskiplistNode
*
update
[
ZSKIPLIST_MAXLEVEL
],
*
x
;
unsigned
int
sp
an
[
ZSKIPLIST_MAXLEVEL
];
unsigned
int
r
an
k
[
ZSKIPLIST_MAXLEVEL
];
int
i
,
level
;
int
i
,
level
;
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
/* store
sp
an that is crossed to reach the insert position */
/* store
r
an
k
that is crossed to reach the insert position */
sp
an
[
i
]
=
i
==
(
zsl
->
level
-
1
)
?
0
:
sp
an
[
i
+
1
];
r
an
k
[
i
]
=
i
==
(
zsl
->
level
-
1
)
?
0
:
r
an
k
[
i
+
1
];
while
(
x
->
forward
[
i
]
&&
while
(
x
->
forward
[
i
]
&&
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
==
score
&&
(
x
->
forward
[
i
]
->
score
==
score
&&
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
obj
)
<
0
)))
{
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
obj
)
<
0
)))
{
sp
an
[
i
]
+=
x
->
span
[
i
]
;
r
an
k
[
i
]
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
x
=
x
->
forward
[
i
];
x
=
x
->
forward
[
i
];
}
}
update
[
i
]
=
x
;
update
[
i
]
=
x
;
...
@@ -4921,9 +4922,9 @@ static void zslInsert(zskiplist *zsl, double score, robj *obj) {
...
@@ -4921,9 +4922,9 @@ static void zslInsert(zskiplist *zsl, double score, robj *obj) {
level
=
zslRandomLevel
();
level
=
zslRandomLevel
();
if
(
level
>
zsl
->
level
)
{
if
(
level
>
zsl
->
level
)
{
for
(
i
=
zsl
->
level
;
i
<
level
;
i
++
)
{
for
(
i
=
zsl
->
level
;
i
<
level
;
i
++
)
{
sp
an
[
i
]
=
0
;
r
an
k
[
i
]
=
0
;
update
[
i
]
=
zsl
->
header
;
update
[
i
]
=
zsl
->
header
;
update
[
i
]
->
span
[
i
]
=
zsl
->
length
;
update
[
i
]
->
span
[
i
-
1
]
=
zsl
->
length
;
}
}
zsl
->
level
=
level
;
zsl
->
level
=
level
;
}
}
...
@@ -4933,13 +4934,15 @@ static void zslInsert(zskiplist *zsl, double score, robj *obj) {
...
@@ -4933,13 +4934,15 @@ static void zslInsert(zskiplist *zsl, double score, robj *obj) {
update
[
i
]
->
forward
[
i
]
=
x
;
update
[
i
]
->
forward
[
i
]
=
x
;
/* update span covered by update[i] as x is inserted here */
/* update span covered by update[i] as x is inserted here */
x
->
span
[
i
]
=
update
[
i
]
->
span
[
i
]
-
(
span
[
0
]
-
span
[
i
]);
if
(
i
>
0
)
{
update
[
i
]
->
span
[
i
]
=
(
span
[
0
]
-
span
[
i
])
+
1
;
x
->
span
[
i
-
1
]
=
update
[
i
]
->
span
[
i
-
1
]
-
(
rank
[
0
]
-
rank
[
i
]);
update
[
i
]
->
span
[
i
-
1
]
=
(
rank
[
0
]
-
rank
[
i
])
+
1
;
}
}
}
/* increment span for untouched levels */
/* increment span for untouched levels */
for
(
i
=
level
;
i
<
zsl
->
level
;
i
++
)
{
for
(
i
=
level
;
i
<
zsl
->
level
;
i
++
)
{
update
[
i
]
->
span
[
i
]
++
;
update
[
i
]
->
span
[
i
-
1
]
++
;
}
}
x
->
backward
=
(
update
[
0
]
==
zsl
->
header
)
?
NULL
:
update
[
0
];
x
->
backward
=
(
update
[
0
]
==
zsl
->
header
)
?
NULL
:
update
[
0
];
...
@@ -4970,10 +4973,14 @@ static int zslDelete(zskiplist *zsl, double score, robj *obj) {
...
@@ -4970,10 +4973,14 @@ static int zslDelete(zskiplist *zsl, double score, robj *obj) {
if
(
x
&&
score
==
x
->
score
&&
compareStringObjects
(
x
->
obj
,
obj
)
==
0
)
{
if
(
x
&&
score
==
x
->
score
&&
compareStringObjects
(
x
->
obj
,
obj
)
==
0
)
{
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
if
(
update
[
i
]
->
forward
[
i
]
==
x
)
{
if
(
update
[
i
]
->
forward
[
i
]
==
x
)
{
update
[
i
]
->
span
[
i
]
+=
x
->
span
[
i
]
-
1
;
if
(
i
>
0
)
{
update
[
i
]
->
span
[
i
-
1
]
+=
x
->
span
[
i
-
1
]
-
1
;
}
update
[
i
]
->
forward
[
i
]
=
x
->
forward
[
i
];
update
[
i
]
->
forward
[
i
]
=
x
->
forward
[
i
];
}
else
{
}
else
{
update
[
i
]
->
span
[
i
]
-=
1
;
/* invariant: i > 0, because update[0]->forward[0]
* is always equal to x */
update
[
i
]
->
span
[
i
-
1
]
-=
1
;
}
}
}
}
if
(
x
->
forward
[
0
])
{
if
(
x
->
forward
[
0
])
{
...
@@ -5015,10 +5022,14 @@ static unsigned long zslDeleteRange(zskiplist *zsl, double min, double max, dict
...
@@ -5015,10 +5022,14 @@ static unsigned long zslDeleteRange(zskiplist *zsl, double min, double max, dict
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
if
(
update
[
i
]
->
forward
[
i
]
==
x
)
{
if
(
update
[
i
]
->
forward
[
i
]
==
x
)
{
update
[
i
]
->
span
[
i
]
+=
x
->
span
[
i
]
-
1
;
if
(
i
>
0
)
{
update
[
i
]
->
span
[
i
-
1
]
+=
x
->
span
[
i
-
1
]
-
1
;
}
update
[
i
]
->
forward
[
i
]
=
x
->
forward
[
i
];
update
[
i
]
->
forward
[
i
]
=
x
->
forward
[
i
];
}
else
{
}
else
{
update
[
i
]
->
span
[
i
]
-=
1
;
/* invariant: i > 0, because update[0]->forward[0]
* is always equal to x */
update
[
i
]
->
span
[
i
-
1
]
-=
1
;
}
}
}
}
if
(
x
->
forward
[
0
])
{
if
(
x
->
forward
[
0
])
{
...
@@ -5069,7 +5080,7 @@ static unsigned long zslGetRank(zskiplist *zsl, double score, robj *o) {
...
@@ -5069,7 +5080,7 @@ static unsigned long zslGetRank(zskiplist *zsl, double score, robj *o) {
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
==
score
&&
(
x
->
forward
[
i
]
->
score
==
score
&&
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
o
)
<=
0
)))
{
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
o
)
<=
0
)))
{
rank
+=
x
->
span
[
i
]
;
rank
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
x
=
x
->
forward
[
i
];
x
=
x
->
forward
[
i
];
}
}
...
@@ -5089,8 +5100,8 @@ zskiplistNode* zslGetElementByRank(zskiplist *zsl, unsigned long rank) {
...
@@ -5089,8 +5100,8 @@ zskiplistNode* zslGetElementByRank(zskiplist *zsl, unsigned long rank) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
x
->
span
[
i
]
)
<=
rank
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
(
i
>
0
?
x
->
span
[
i
-
1
]
:
1
)
)
<=
rank
)
{
traversed
+=
x
->
span
[
i
]
;
traversed
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
x
=
x
->
forward
[
i
];
x
=
x
->
forward
[
i
];
}
}
...
...
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