summaryrefslogtreecommitdiff
path: root/async.c
diff options
context:
space:
mode:
authorMatt Stancliff <matt@genges.com>2014-04-07 11:57:26 -0400
committerMatt Stancliff <matt@genges.com>2014-04-08 19:37:29 -0400
commit7f0c7a29fd4d0f0623db522501c2b66eb8ebb94d (patch)
treeca854df2a7c310395354fe9327da16cc335893a6 /async.c
parent065e90557c2f2bce6205c5006144bec75638836f (diff)
Remove possiblity of multiple close on same fd
With all the async connects and disconnects and error handling going on in hiredis, we need to centralize how we close our fd and set it so it doesn't get re-closed. Prior to this commit, sometimes we'd close(fd), run an async error handler, then call close(fd) again. To stop multiple closes, we now set fd to -1 after we free it, but that requires not passing fd as an independent argument to functions. This commit moves all fd usage to c->fd. Since the context has a fd field and all functions receive the context, it makes more sense to use the fd inside of c instead of passing along fd as an independent argument. Also, by only using c->fd, we can set c->fd after we close it to signify we shouldn't re-close the same fd again. This does change one semi-public interface function redisCheckSocketError() to only take (context) instead of (context, fd). A search on github returned zero occasions of people using redisCheckSocketError() outside of net.{c,h} in hiredis itself. Commit inspired by the bug report at: https://groups.google.com/forum/#!topic/redis-db/mQm46XkIPOY Thanks go out to Thijs for trying high-frequency reconnects on a host that isn't there. Closes #230
Diffstat (limited to 'async.c')
-rw-r--r--async.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/async.c b/async.c
index 923a329..48c40c3 100644
--- a/async.c
+++ b/async.c
@@ -473,7 +473,7 @@ void redisProcessCallbacks(redisAsyncContext *ac) {
static int __redisAsyncHandleConnect(redisAsyncContext *ac) {
redisContext *c = &(ac->c);
- if (redisCheckSocketError(c,c->fd) == REDIS_ERR) {
+ if (redisCheckSocketError(c) == REDIS_ERR) {
/* Try again later when connect(2) is still in progress. */
if (errno == EINPROGRESS)
return REDIS_OK;