add grace period for race in connection cleanup
This commit is contained in:
@@ -187,6 +187,7 @@ void Connection::run() {
|
|||||||
delete m_socket;
|
delete m_socket;
|
||||||
m_socket = nullptr;
|
m_socket = nullptr;
|
||||||
}
|
}
|
||||||
|
time(&m_endedAt);
|
||||||
logInfo(lf_network, "[%05d] connection closed", getID());
|
logInfo(lf_network, "[%05d] connection closed", getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,9 +340,12 @@ void Network::run() {
|
|||||||
|
|
||||||
void Network::cleanConnections() {
|
void Network::cleanConnections() {
|
||||||
auto it = m_connections.begin();
|
auto it = m_connections.begin();
|
||||||
|
time_t endBefore;
|
||||||
|
time(&endBefore);
|
||||||
|
endBefore += 5; // after 5 seconds grace period
|
||||||
while (it != m_connections.end()) {
|
while (it != m_connections.end()) {
|
||||||
if (!(*it)->isRunning()) {
|
|
||||||
Connection* connection = *it;
|
Connection* connection = *it;
|
||||||
|
if (connection && !connection->isRunning() && connection->endedBefore(&endBefore)) {
|
||||||
it = m_connections.erase(it);
|
it = m_connections.erase(it);
|
||||||
delete connection;
|
delete connection;
|
||||||
logDebug(lf_network, "dead connection removed - %d", m_connections.size());
|
logDebug(lf_network, "dead connection removed - %d", m_connections.size());
|
||||||
|
|||||||
+10
-1
@@ -227,7 +227,7 @@ class Connection : public Thread {
|
|||||||
* @param netQueue the reference to the @a NetMessage @a Queue.
|
* @param netQueue the reference to the @a NetMessage @a Queue.
|
||||||
*/
|
*/
|
||||||
Connection(TCPSocket* socket, const bool isHttp, Queue<NetMessage*>* netQueue)
|
Connection(TCPSocket* socket, const bool isHttp, Queue<NetMessage*>* netQueue)
|
||||||
: Thread(), m_isHttp(isHttp), m_socket(socket), m_netQueue(netQueue) {
|
: Thread(), m_isHttp(isHttp), m_socket(socket), m_netQueue(netQueue), m_endedAt(0) {
|
||||||
m_id = ++m_ids;
|
m_id = ++m_ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,6 +253,12 @@ class Connection : public Thread {
|
|||||||
*/
|
*/
|
||||||
int getID() { return m_id; }
|
int getID() { return m_id; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether this connection has ended before the specified time.
|
||||||
|
* @param time the time to check against.
|
||||||
|
* @return true when this connection has ended before the specified time.
|
||||||
|
*/
|
||||||
|
bool endedBefore(const time_t* time) const { return m_endedAt > 0 && time && m_endedAt < *time; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** whether this is a HTTP connection. */
|
/** whether this is a HTTP connection. */
|
||||||
@@ -270,6 +276,9 @@ class Connection : public Thread {
|
|||||||
/** the ID of this connection. */
|
/** the ID of this connection. */
|
||||||
int m_id;
|
int m_id;
|
||||||
|
|
||||||
|
/** the time when this connected ended, or 0 if not yet. */
|
||||||
|
time_t m_endedAt;
|
||||||
|
|
||||||
/** the IF of the last opened connection. */
|
/** the IF of the last opened connection. */
|
||||||
static int m_ids;
|
static int m_ids;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user