Introduce .close method for redisContextFuncs
Currently, hiredis supports TCP/SSL/Unix, all of the connection types use a single FD(int), close() is enough to close a connection. For the further step, introduce .close method for redisContextFuncs, this allows to close a complex connection context, for example RDMA. Signed-off-by: zhenwei pi <pizhenwei@bytedance.com>
This commit is contained in:
parent
cfb6ca8811
commit
fce8abc1c1
10
hiredis.c
10
hiredis.c
@ -48,6 +48,7 @@ extern int redisContextUpdateConnectTimeout(redisContext *c, const struct timeva
|
|||||||
extern int redisContextUpdateCommandTimeout(redisContext *c, const struct timeval *timeout);
|
extern int redisContextUpdateCommandTimeout(redisContext *c, const struct timeval *timeout);
|
||||||
|
|
||||||
static redisContextFuncs redisContextDefaultFuncs = {
|
static redisContextFuncs redisContextDefaultFuncs = {
|
||||||
|
.close = redisNetClose,
|
||||||
.free_privctx = NULL,
|
.free_privctx = NULL,
|
||||||
.async_read = redisAsyncRead,
|
.async_read = redisAsyncRead,
|
||||||
.async_write = redisAsyncWrite,
|
.async_write = redisAsyncWrite,
|
||||||
@ -729,7 +730,10 @@ static redisContext *redisContextInit(void) {
|
|||||||
void redisFree(redisContext *c) {
|
void redisFree(redisContext *c) {
|
||||||
if (c == NULL)
|
if (c == NULL)
|
||||||
return;
|
return;
|
||||||
redisNetClose(c);
|
|
||||||
|
if (c->funcs && c->funcs->close) {
|
||||||
|
c->funcs->close(c);
|
||||||
|
}
|
||||||
|
|
||||||
sdsfree(c->obuf);
|
sdsfree(c->obuf);
|
||||||
redisReaderFree(c->reader);
|
redisReaderFree(c->reader);
|
||||||
@ -766,7 +770,9 @@ int redisReconnect(redisContext *c) {
|
|||||||
c->privctx = NULL;
|
c->privctx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
redisNetClose(c);
|
if (c->funcs && c->funcs->close) {
|
||||||
|
c->funcs->close(c);
|
||||||
|
}
|
||||||
|
|
||||||
sdsfree(c->obuf);
|
sdsfree(c->obuf);
|
||||||
redisReaderFree(c->reader);
|
redisReaderFree(c->reader);
|
||||||
|
@ -245,6 +245,7 @@ typedef struct {
|
|||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
typedef struct redisContextFuncs {
|
typedef struct redisContextFuncs {
|
||||||
|
void (*close)(struct redisContext *);
|
||||||
void (*free_privctx)(void *);
|
void (*free_privctx)(void *);
|
||||||
void (*async_read)(struct redisAsyncContext *);
|
void (*async_read)(struct redisAsyncContext *);
|
||||||
void (*async_write)(struct redisAsyncContext *);
|
void (*async_write)(struct redisAsyncContext *);
|
||||||
|
2
ssl.c
2
ssl.c
@ -32,6 +32,7 @@
|
|||||||
|
|
||||||
#include "hiredis.h"
|
#include "hiredis.h"
|
||||||
#include "async.h"
|
#include "async.h"
|
||||||
|
#include "net.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -579,6 +580,7 @@ static void redisSSLAsyncWrite(redisAsyncContext *ac) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
redisContextFuncs redisContextSSLFuncs = {
|
redisContextFuncs redisContextSSLFuncs = {
|
||||||
|
.close = redisNetClose,
|
||||||
.free_privctx = redisSSLFree,
|
.free_privctx = redisSSLFree,
|
||||||
.async_read = redisSSLAsyncRead,
|
.async_read = redisSSLAsyncRead,
|
||||||
.async_write = redisSSLAsyncWrite,
|
.async_write = redisSSLAsyncWrite,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user