From 9dff5105fc01f52437d862bc95d40415f03179f0 Mon Sep 17 00:00:00 2001 From: "Allen.Dou" Date: Tue, 30 Apr 2013 00:11:57 +0800 Subject: [PATCH] Make KeepAlive optional Make Connection KeepAlive being optional instead of default. --- hiredis.c | 7 +++++++ hiredis.h | 1 + net.c | 9 +++------ net.h | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/hiredis.c b/hiredis.c index 958f58b..84baa8c 100644 --- a/hiredis.c +++ b/hiredis.c @@ -1092,6 +1092,13 @@ int redisSetTimeout(redisContext *c, struct timeval tv) { return REDIS_ERR; } +/* Enable connection KeepAlive. */ +int redisEnableKeepAlive(redisContext *c) { + if (redisKeepAlive(c, REDIS_KEEPALIVE_INTERVAL) != REDIS_OK) + return REDIS_ERR; + return REDIS_OK; +} + /* Use this function to handle a read event on the descriptor. It will try * and read some bytes from the socket and feed them to the reply parser. * diff --git a/hiredis.h b/hiredis.h index a861761..42290a1 100644 --- a/hiredis.h +++ b/hiredis.h @@ -179,6 +179,7 @@ redisContext *redisConnectUnix(const char *path); redisContext *redisConnectUnixWithTimeout(const char *path, struct timeval tv); redisContext *redisConnectUnixNonBlock(const char *path); int redisSetTimeout(redisContext *c, struct timeval tv); +int redisEnableKeepAlive(redisContext *c); void redisFree(redisContext *c); int redisBufferRead(redisContext *c); int redisBufferWrite(redisContext *c, int *done); diff --git a/net.c b/net.c index 57557cd..bf571fc 100644 --- a/net.c +++ b/net.c @@ -113,9 +113,10 @@ static int redisSetBlocking(redisContext *c, int fd, int blocking) { return REDIS_OK; } -static int redisKeepAlive(redisContext *c,int fd,int interval) { +int redisKeepAlive(redisContext *c, int interval) { int val = 1; - + int fd = c->fd; + if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val)) == -1){ __redisSetError(c,REDIS_ERR_OTHER,strerror(errno)); return REDIS_ERR; @@ -143,8 +144,6 @@ static int redisKeepAlive(redisContext *c,int fd,int interval) { return REDIS_OK; } - - static int redisSetTcpNoDelay(redisContext *c, int fd) { int yes = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)) == -1) { @@ -273,8 +272,6 @@ int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct t goto error; if (redisSetTcpNoDelay(c,s) != REDIS_OK) goto error; - if (redisKeepAlive(c,s,REDIS_KEEPALIVE_INTERVAL) != REDIS_OK) - goto error; c->fd = s; c->flags |= REDIS_CONNECTED; diff --git a/net.h b/net.h index eb8a0a1..36096fe 100644 --- a/net.h +++ b/net.h @@ -43,5 +43,6 @@ int redisCheckSocketError(redisContext *c, int fd); int redisContextSetTimeout(redisContext *c, struct timeval tv); int redisContextConnectTcp(redisContext *c, const char *addr, int port, struct timeval *timeout); int redisContextConnectUnix(redisContext *c, const char *path, struct timeval *timeout); +int redisKeepAlive(redisContext *c, int interval); #endif