{
debugs(5,5, HERE);
unsubscribe("swanSong");
+ if (IsConnOpen(conn)) {
+ if (closer_ != NULL)
+ comm_remove_close_handler(conn->fd, closer_);
+ conn->close();
+ }
+
conn = NULL;
AcceptLimiter::Instance().removeDead(this);
AsyncJob::swanSong();
debugs(5, DBG_CRITICAL, "WARNING: accept_filter not supported on your OS");
#endif
}
+
+ typedef CommCbMemFunT<Comm::TcpAcceptor, CommCloseCbParams> Dialer;
+ closer_ = JobCallback(5, 4, Dialer, this, Comm::TcpAcceptor::handleClosure);
+ comm_add_close_handler(conn->fd, closer_);
+}
+
+/// called when listening descriptor is closed by an external force
+/// such as clientHttpConnectionsClose()
+void
+Comm::TcpAcceptor::handleClosure(const CommCloseCbParams &io)
+{
+ closer_ = NULL;
+ conn = NULL;
+ Must(done());
}
/**
#include "comm/forward.h"
#include "comm_err_t.h"
+class CommCloseCbParams;
+
namespace Comm
{
/// Reserved for read-only use.
ConnectionPointer conn;
+ /// listen socket closure handler
+ AsyncCall::Pointer closer_;
+
/// Method to test if there are enough file descriptors to open a new client connection
/// if not the accept() will be postponed
static bool okToAccept();
void acceptOne();
comm_err_t oldAccept(Comm::ConnectionPointer &details);
void setListen();
+ void handleClosure(const CommCloseCbParams &io);
CBDATA_CLASS2(TcpAcceptor);
};