• Matt Stancliff's avatar
    Remove possiblity of multiple close on same fd · 7f0c7a29
    Matt Stancliff authored
    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
    7f0c7a29
net.h 2.19 KB