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
hiredis
Commits
8419b060
Commit
8419b060
authored
Apr 21, 2011
by
Pieter Noordhuis
Browse files
Handle OOM when doing blocking requests
parent
e932709a
Changes
2
Hide whitespace changes
Inline
Side-by-side
hiredis.c
View file @
8419b060
...
@@ -1107,31 +1107,65 @@ int redisGetReply(redisContext *c, void **reply) {
...
@@ -1107,31 +1107,65 @@ int redisGetReply(redisContext *c, void **reply) {
* is used, you need to call redisGetReply yourself to retrieve
* is used, you need to call redisGetReply yourself to retrieve
* the reply (or replies in pub/sub).
* the reply (or replies in pub/sub).
*/
*/
void
__redisAppendCommand
(
redisContext
*
c
,
char
*
cmd
,
size_t
len
)
{
int
__redisAppendCommand
(
redisContext
*
c
,
char
*
cmd
,
size_t
len
)
{
c
->
obuf
=
sdscatlen
(
c
->
obuf
,
cmd
,
len
);
sds
newbuf
;
newbuf
=
sdscatlen
(
c
->
obuf
,
cmd
,
len
);
if
(
newbuf
==
NULL
)
{
__redisSetError
(
c
,
REDIS_ERR_OOM
,
"Out of memory"
);
return
REDIS_ERR
;
}
c
->
obuf
=
newbuf
;
return
REDIS_OK
;
}
}
void
redisvAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
)
{
int
redisvAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
)
{
char
*
cmd
;
char
*
cmd
;
int
len
;
int
len
;
len
=
redisvFormatCommand
(
&
cmd
,
format
,
ap
);
len
=
redisvFormatCommand
(
&
cmd
,
format
,
ap
);
__redisAppendCommand
(
c
,
cmd
,
len
);
if
(
len
==
-
1
)
{
__redisSetError
(
c
,
REDIS_ERR_OOM
,
"Out of memory"
);
return
REDIS_ERR
;
}
if
(
__redisAppendCommand
(
c
,
cmd
,
len
)
!=
REDIS_OK
)
{
free
(
cmd
);
return
REDIS_ERR
;
}
free
(
cmd
);
free
(
cmd
);
return
REDIS_OK
;
}
}
void
redisAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
...)
{
int
redisAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
...)
{
va_list
ap
;
va_list
ap
;
int
ret
;
va_start
(
ap
,
format
);
va_start
(
ap
,
format
);
redisvAppendCommand
(
c
,
format
,
ap
);
ret
=
redisvAppendCommand
(
c
,
format
,
ap
);
va_end
(
ap
);
va_end
(
ap
);
return
ret
;
}
}
void
redisAppendCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
)
{
int
redisAppendCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
)
{
char
*
cmd
;
char
*
cmd
;
int
len
;
int
len
;
len
=
redisFormatCommandArgv
(
&
cmd
,
argc
,
argv
,
argvlen
);
len
=
redisFormatCommandArgv
(
&
cmd
,
argc
,
argv
,
argvlen
);
__redisAppendCommand
(
c
,
cmd
,
len
);
if
(
len
==
-
1
)
{
__redisSetError
(
c
,
REDIS_ERR_OOM
,
"Out of memory"
);
return
REDIS_ERR
;
}
if
(
__redisAppendCommand
(
c
,
cmd
,
len
)
!=
REDIS_OK
)
{
free
(
cmd
);
return
REDIS_ERR
;
}
free
(
cmd
);
free
(
cmd
);
return
REDIS_OK
;
}
}
/* Helper function for the redisCommand* family of functions.
/* Helper function for the redisCommand* family of functions.
...
@@ -1145,26 +1179,21 @@ void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const
...
@@ -1145,26 +1179,21 @@ void redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const
* otherwise. When NULL is returned in a blocking context, the error field
* otherwise. When NULL is returned in a blocking context, the error field
* in the context will be set.
* in the context will be set.
*/
*/
static
void
*
__redisCommand
(
redisContext
*
c
,
char
*
cmd
,
size_t
len
)
{
static
void
*
__redisBlockForReply
(
redisContext
*
c
)
{
void
*
aux
=
NULL
;
void
*
reply
;
__redisAppendCommand
(
c
,
cmd
,
len
);
if
(
c
->
flags
&
REDIS_BLOCK
)
{
if
(
c
->
flags
&
REDIS_BLOCK
)
{
if
(
redisGetReply
(
c
,
&
aux
)
=
=
REDIS_OK
)
if
(
redisGetReply
(
c
,
&
reply
)
!
=
REDIS_OK
)
return
aux
;
return
NULL
;
return
NULL
;
return
reply
;
}
}
return
NULL
;
return
NULL
;
}
}
void
*
redisvCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
)
{
void
*
redisvCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
)
{
char
*
cmd
;
if
(
redisvAppendCommand
(
c
,
format
,
ap
)
!=
REDIS_OK
)
int
len
;
return
NULL
;
void
*
reply
=
NULL
;
return
__redisBlockForReply
(
c
);
len
=
redisvFormatCommand
(
&
cmd
,
format
,
ap
);
reply
=
__redisCommand
(
c
,
cmd
,
len
);
free
(
cmd
);
return
reply
;
}
}
void
*
redisCommand
(
redisContext
*
c
,
const
char
*
format
,
...)
{
void
*
redisCommand
(
redisContext
*
c
,
const
char
*
format
,
...)
{
...
@@ -1177,11 +1206,7 @@ void *redisCommand(redisContext *c, const char *format, ...) {
...
@@ -1177,11 +1206,7 @@ void *redisCommand(redisContext *c, const char *format, ...) {
}
}
void
*
redisCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
)
{
void
*
redisCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
)
{
char
*
cmd
;
if
(
redisAppendCommandArgv
(
c
,
argc
,
argv
,
argvlen
)
!=
REDIS_OK
)
int
len
;
return
NULL
;
void
*
reply
=
NULL
;
return
__redisBlockForReply
(
c
);
len
=
redisFormatCommandArgv
(
&
cmd
,
argc
,
argv
,
argvlen
);
reply
=
__redisCommand
(
c
,
cmd
,
len
);
free
(
cmd
);
return
reply
;
}
}
hiredis.h
View file @
8419b060
...
@@ -184,9 +184,9 @@ int redisGetReplyFromReader(redisContext *c, void **reply);
...
@@ -184,9 +184,9 @@ int redisGetReplyFromReader(redisContext *c, void **reply);
/* Write a command to the output buffer. Use these functions in blocking mode
/* Write a command to the output buffer. Use these functions in blocking mode
* to get a pipeline of commands. */
* to get a pipeline of commands. */
void
redisvAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
);
int
redisvAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
va_list
ap
);
void
redisAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
...);
int
redisAppendCommand
(
redisContext
*
c
,
const
char
*
format
,
...);
void
redisAppendCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
);
int
redisAppendCommandArgv
(
redisContext
*
c
,
int
argc
,
const
char
**
argv
,
const
size_t
*
argvlen
);
/* Issue a command to Redis. In a blocking context, it is identical to calling
/* Issue a command to Redis. In a blocking context, it is identical to calling
* redisAppendCommand, followed by redisGetReply. The function will return
* redisAppendCommand, followed by redisGetReply. The function will return
...
...
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