Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
f2d9f50f
Commit
f2d9f50f
authored
Jan 12, 2010
by
antirez
Browse files
more non blocking VM changes
parent
d663729a
Changes
1
Hide whitespace changes
Inline
Side-by-side
redis.c
View file @
f2d9f50f
...
...
@@ -949,6 +949,7 @@ static unsigned int dictEncObjHash(const void *key) {
return
hash
;
}
/* Sets type and expires */
static
dictType
setDictType
=
{
dictEncObjHash
,
/* hash function */
NULL
,
/* key dup */
...
...
@@ -958,6 +959,7 @@ static dictType setDictType = {
NULL
/* val destructor */
};
/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */
static
dictType
zsetDictType
=
{
dictEncObjHash
,
/* hash function */
NULL
,
/* key dup */
...
...
@@ -967,6 +969,7 @@ static dictType zsetDictType = {
dictVanillaFree
/* val destructor of malloc(sizeof(double)) */
};
/* Db->dict */
static
dictType
hashDictType
=
{
dictObjHash
,
/* hash function */
NULL
,
/* key dup */
...
...
@@ -976,6 +979,16 @@ static dictType hashDictType = {
dictRedisObjectDestructor
/* val destructor */
};
/* Db->expires */
static
dictType
keyptrDictType
=
{
dictObjHash
,
/* hash function */
NULL
,
/* key dup */
NULL
,
/* val dup */
dictObjKeyCompare
,
/* key compare */
dictRedisObjectDestructor
,
/* key destructor */
NULL
/* val destructor */
};
/* Keylist hash table type has unencoded redis objects as keys and
* lists as values. It's used for blocking operations (BLPOP) */
static
dictType
keylistDictType
=
{
...
...
@@ -1402,7 +1415,7 @@ static void initServer() {
}
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
server
.
db
[
j
].
dict
=
dictCreate
(
&
hashDictType
,
NULL
);
server
.
db
[
j
].
expires
=
dictCreate
(
&
set
DictType
,
NULL
);
server
.
db
[
j
].
expires
=
dictCreate
(
&
keyptr
DictType
,
NULL
);
server
.
db
[
j
].
blockingkeys
=
dictCreate
(
&
keylistDictType
,
NULL
);
server
.
db
[
j
].
id
=
j
;
}
...
...
@@ -2854,21 +2867,16 @@ static int rdbSaveStringObjectRaw(FILE *fp, robj *obj) {
static
int
rdbSaveStringObject
(
FILE
*
fp
,
robj
*
obj
)
{
int
retval
;
if
(
obj
->
storage
==
REDIS_VM_MEMORY
&&
obj
->
encoding
!=
REDIS_ENCODING_RAW
)
{
/* Avoid incr/decr ref count business when possible.
* This plays well with copy-on-write given that we are probably
* in a child process (BGSAVE). Also this makes sure key objects
* of swapped objects are not incRefCount-ed (an assert does not allow
* this in order to avoid bugs) */
if
(
obj
->
encoding
!=
REDIS_ENCODING_RAW
)
{
obj
=
getDecodedObject
(
obj
);
retval
=
rdbSaveStringObjectRaw
(
fp
,
obj
);
decrRefCount
(
obj
);
}
else
{
/* This is a fast path when we are sure the object is not encoded.
* Note that's any *faster* actually as we needed to add the conditional
* but because this may happen in a background process we don't want
* to touch the object fields with incr/decrRefCount in order to
* preveny copy on write of pages.
*
* Also incrRefCount() will have a failing assert() if we try to call
* it against an object with storage != REDIS_VM_MEMORY. */
retval
=
rdbSaveStringObjectRaw
(
fp
,
obj
);
}
return
retval
;
...
...
@@ -6670,7 +6678,12 @@ static int fwriteBulk(FILE *fp, robj *obj) {
char
buf
[
128
];
int
decrrc
=
0
;
if
(
obj
->
storage
==
REDIS_VM_MEMORY
&&
obj
->
encoding
!=
REDIS_ENCODING_RAW
){
/* Avoid the incr/decr ref count business if possible to help
* copy-on-write (we are often in a child process when this function
* is called).
* Also makes sure that key objects don't get incrRefCount-ed when VM
* is enabled */
if
(
obj
->
encoding
!=
REDIS_ENCODING_RAW
)
{
obj
=
getDecodedObject
(
obj
);
decrrc
=
1
;
}
...
...
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