# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: rousskov@measurement-factory.com-20080911045434-\ # 0to85mcx6rhigkpn # target_branch: file:///home/rousskov/programs/bazaar/repos/squid\ # /trunk/ # testament_sha1: b3e7f34f67f66dd8c95c3a56fdc70aa23714ee6e # timestamp: 2008-09-10 23:45:26 -0600 # message: Cleanup, client_side part # base_revision_id: amosjeffries@squid-cache.org-20080910015634-\ # 2xvc2fymhl885rm6 # # Begin patch === modified file 'src/client_side.cc' --- src/client_side.cc 2008-07-11 15:15:40 +0000 +++ src/client_side.cc 2008-09-11 04:54:34 +0000 @@ -602,14 +602,14 @@ void ConnStateData::connStateClosed(const CommCloseCbParams &io) { assert (fd == io.fd); - close(); + deleteThis("ConnStateData::connStateClosed"); } +// cleans up before destructor is called void -ConnStateData::close() +ConnStateData::swanSong() { - debugs(33, 3, "ConnStateData::close: FD " << fd); - deleteThis("ConnStateData::close"); + debugs(33, 2, "ConnStateData::swanSong: FD " << fd); fd = -1; flags.readMoreRequests = false; clientdbEstablished(peer, -1); /* decrement */ @@ -617,9 +617,12 @@ freeAllContexts(); if (auth_user_request != NULL) { - debugs(33, 4, "ConnStateData::close: freeing auth_user_request '" << auth_user_request << "' (this is '" << this << "')"); + debugs(33, 4, "ConnStateData::swanSong: freeing auth_user_request '" << auth_user_request << "' (this is '" << this << "')"); auth_user_request->onConnectionClose(this); } + + BodyProducer::swanSong(); + flags.swanSang = true; } bool @@ -636,7 +639,10 @@ debugs(33, 3, "ConnStateData::~ConnStateData: FD " << fd); if (isOpen()) - close(); + debugs(33, 1, "BUG: ConnStateData did not close FD " << fd); + + if (!flags.swanSang) + debugs(33, 1, "BUG: ConnStateData was not destroyed properly; FD " << fd); AUTHUSERREQUESTUNLOCK(auth_user_request, "~conn"); @@ -1587,6 +1593,8 @@ comm_close(fd()); } +/** Called to initiate (and possibly complete) closing of the context. + * The underlying socket may be already closed */ void ClientSocketContext::initiateClose(const char *reason) { @@ -1660,10 +1668,11 @@ return; case STREAM_UNPLANNED_COMPLETE: - /* fallthrough */ + initiateClose("STREAM_UNPLANNED_COMPLETE"); + return; case STREAM_FAILED: - initiateClose("STREAM_UNPLANNED_COMPLETE|STREAM_FAILED"); + initiateClose("STREAM_FAILED"); return; default: @@ -2551,6 +2560,7 @@ * The above check with connFinishedWithConn() only * succeeds _if_ the buffer is empty which it won't * be if we have an incomplete request. + * XXX: This duplicates ClientSocketContext::keepaliveNextRequest */ if (getConcurrentRequestCount() == 0 && commIsHalfClosed(fd)) { debugs(33, 5, "clientReadRequest: FD " << fd << ": half-closed connection, no completed request parsed, connection closing."); === modified file 'src/client_side.h' --- src/client_side.h 2008-03-16 22:10:18 +0000 +++ src/client_side.h 2008-09-11 04:54:34 +0000 @@ -142,7 +142,6 @@ ClientSocketContext::Pointer getCurrentContext() const; void addContextToQueue(ClientSocketContext * context); int getConcurrentRequestCount() const; - void close(); bool isOpen() const; int fd; @@ -188,6 +187,7 @@ struct { bool readMoreRequests; + bool swanSang; // XXX: temporary flag to check proper cleanup } flags; http_port_list *port; @@ -213,6 +213,7 @@ // AsyncJob API virtual bool doneAll() const { return BodyProducer::doneAll() && false;} + virtual void swanSong(); #if USE_SSL bool switchToHttps(); # Begin bundle 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 pwoSEjZgwcA=