At Thu, 5 Jul 2012 18:34:10 +0800, Yunkai Zhang wrote: > > From: Yunkai Zhang <[email protected]> > > When connection is dead, we should: > 1) do some clear actions about this connection. > 2) unregister it's fd from epoll. > 3) destroy this connection directly, since it's fd has been unregistered, > sheep couldn't receive any new events of this fd. > *Note*: If we use client_decref() instread of destroy_client(), this fd > may not be destroyed when ci->refcnt is larger than 1, than this fd could > not be closed in the future. > > Now I add a helper named clear_client() to do these works. > > Signed-off-by: Yunkai Zhang <[email protected]> > --- > sheep/sdnet.c | 20 ++++++++++++-------- > 1 file changed, 12 insertions(+), 8 deletions(-) > > diff --git a/sheep/sdnet.c b/sheep/sdnet.c > index c13cdb0..b493428 100644 > --- a/sheep/sdnet.c > +++ b/sheep/sdnet.c > @@ -370,6 +370,7 @@ static void requeue_request(struct request *req) > > static void client_incref(struct client_info *ci); > static void client_decref(struct client_info *ci); > +static void clear_client(struct client_info *ci); > > static struct request *alloc_local_request(void *data, int data_length) > { > @@ -473,11 +474,10 @@ void put_request(struct request *req) > if (conn_tx_on(&ci->conn)) { > dprintf("connection seems to be dead\n"); > free_request(req); > + clear_client(ci);
We cannot free the client_info here because there may be other inflight requests which use it, no? Thanks, Kazutaka -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
