summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMeir Shpilraien (Spielrein) <meir@redislabs.com>2021-07-11 21:26:20 +0300
committerGitHub <noreply@github.com>2021-07-11 11:26:20 -0700
commitf5f31ff9b92b6bdf628716449d0d0782ceb7704a (patch)
tree06488aa9aa14564e91a282aa5f83d546c87ee144
parent5850a8ecd2fb4ab39d80773e3017f02aff097ec4 (diff)
Added REDIS_NO_AUTO_FREE_REPLIES flag (#962)
When set hiredis will not automatically free replies in an async context, and the replies must be freed instead by the user. Co-authored-by: Michael Grunder <michael.grunder@gmail.com>
-rw-r--r--async.c4
-rw-r--r--hiredis.c3
-rw-r--r--hiredis.h8
3 files changed, 14 insertions, 1 deletions
diff --git a/async.c b/async.c
index 29f6924..e37afbd 100644
--- a/async.c
+++ b/async.c
@@ -569,7 +569,9 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
if (cb.fn != NULL) {
__redisRunCallback(ac,&cb,reply);
- c->reader->fn->freeObject(reply);
+ if (!(c->flags & REDIS_NO_AUTO_FREE_REPLIES)){
+ c->reader->fn->freeObject(reply);
+ }
/* Proceed with free'ing when redisAsyncFree() was called. */
if (c->flags & REDIS_FREEING) {
diff --git a/hiredis.c b/hiredis.c
index 5825174..9947b1e 100644
--- a/hiredis.c
+++ b/hiredis.c
@@ -804,6 +804,9 @@ redisContext *redisConnectWithOptions(const redisOptions *options) {
if (options->options & REDIS_OPT_NOAUTOFREE) {
c->flags |= REDIS_NO_AUTO_FREE;
}
+ if (options->options & REDIS_OPT_NOAUTOFREEREPLIES) {
+ c->flags |= REDIS_NO_AUTO_FREE_REPLIES;
+ }
/* Set any user supplied RESP3 PUSH handler or use freeReplyObject
* as a default unless specifically flagged that we don't want one. */
diff --git a/hiredis.h b/hiredis.h
index e77a88a..be8525f 100644
--- a/hiredis.h
+++ b/hiredis.h
@@ -86,6 +86,9 @@ typedef long long ssize_t;
*/
#define REDIS_NO_AUTO_FREE 0x200
+/* Flag that indicates the user does not want replies to be automatically freed */
+#define REDIS_NO_AUTO_FREE_REPLIES 0x400
+
#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */
/* number of times we retry to connect in the case of EADDRNOTAVAIL and
@@ -153,6 +156,11 @@ struct redisSsl;
/* Don't automatically intercept and free RESP3 PUSH replies. */
#define REDIS_OPT_NO_PUSH_AUTOFREE 0x08
+/**
+ * Don't automatically free replies
+ */
+#define REDIS_OPT_NOAUTOFREEREPLIES 0x10
+
/* In Unix systems a file descriptor is a regular signed int, with -1
* representing an invalid descriptor. In Windows it is a SOCKET
* (32- or 64-bit unsigned integer depending on the architecture), where