Merge pull request #557 from galkinvv/fix-loop-tcp-disconnection
Fix infinite loop on fast TCP disconnection
This commit is contained in:
commit
72d1c8cd65
|
@ -761,7 +761,7 @@ MultiplexerJobStatus SecureSocket::serviceConnect(ISocketMultiplexerJob* job,
|
||||||
// If status > 0, success
|
// If status > 0, success
|
||||||
if (status > 0) {
|
if (status > 0) {
|
||||||
sendEvent(m_events->forIDataSocket().secureConnected());
|
sendEvent(m_events->forIDataSocket().secureConnected());
|
||||||
return {true, newJob()};
|
return newJobOrStopServicing();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retry case
|
// Retry case
|
||||||
|
@ -793,7 +793,7 @@ MultiplexerJobStatus SecureSocket::serviceAccept(ISocketMultiplexerJob* job,
|
||||||
// If status > 0, success
|
// If status > 0, success
|
||||||
if (status > 0) {
|
if (status > 0) {
|
||||||
sendEvent(m_events->forClientListener().accepted());
|
sendEvent(m_events->forClientListener().accepted());
|
||||||
return {true, newJob()};
|
return newJobOrStopServicing();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retry case
|
// Retry case
|
||||||
|
|
|
@ -403,6 +403,15 @@ void TCPSocket::setJob(std::unique_ptr<ISocketMultiplexerJob>&& job)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MultiplexerJobStatus TCPSocket::newJobOrStopServicing()
|
||||||
|
{
|
||||||
|
auto new_job = newJob();
|
||||||
|
if (new_job)
|
||||||
|
return {true, std::move(new_job)};
|
||||||
|
else
|
||||||
|
return {false, {}};
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<ISocketMultiplexerJob> TCPSocket::newJob()
|
std::unique_ptr<ISocketMultiplexerJob> TCPSocket::newJob()
|
||||||
{
|
{
|
||||||
// note -- must have m_mutex locked on entry
|
// note -- must have m_mutex locked on entry
|
||||||
|
@ -519,22 +528,14 @@ MultiplexerJobStatus TCPSocket::serviceConnecting(ISocketMultiplexerJob* job, bo
|
||||||
catch (XArchNetwork& e) {
|
catch (XArchNetwork& e) {
|
||||||
sendConnectionFailedEvent(e.what());
|
sendConnectionFailedEvent(e.what());
|
||||||
onDisconnected();
|
onDisconnected();
|
||||||
auto new_job = newJob();
|
return newJobOrStopServicing();
|
||||||
if (new_job)
|
|
||||||
return {true, std::move(new_job)};
|
|
||||||
else
|
|
||||||
return {false, {}};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write) {
|
if (write) {
|
||||||
sendEvent(m_events->forIDataSocket().connected());
|
sendEvent(m_events->forIDataSocket().connected());
|
||||||
onConnected();
|
onConnected();
|
||||||
auto new_job = newJob();
|
return newJobOrStopServicing();
|
||||||
if (new_job)
|
|
||||||
return {true, std::move(new_job)};
|
|
||||||
else
|
|
||||||
return {false, {}};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {true, {}};
|
return {true, {}};
|
||||||
|
@ -548,7 +549,7 @@ MultiplexerJobStatus TCPSocket::serviceConnected(ISocketMultiplexerJob* job,
|
||||||
if (error) {
|
if (error) {
|
||||||
sendEvent(m_events->forISocket().disconnected());
|
sendEvent(m_events->forISocket().disconnected());
|
||||||
onDisconnected();
|
onDisconnected();
|
||||||
return {true, newJob()};
|
return newJobOrStopServicing();
|
||||||
}
|
}
|
||||||
|
|
||||||
EJobResult writeResult = kRetry;
|
EJobResult writeResult = kRetry;
|
||||||
|
@ -603,7 +604,7 @@ MultiplexerJobStatus TCPSocket::serviceConnected(ISocketMultiplexerJob* job,
|
||||||
if (writeResult == kBreak || readResult == kBreak) {
|
if (writeResult == kBreak || readResult == kBreak) {
|
||||||
return {false, {}};
|
return {false, {}};
|
||||||
} else if (writeResult == kNew || readResult == kNew) {
|
} else if (writeResult == kNew || readResult == kNew) {
|
||||||
return {true, newJob()};
|
return newJobOrStopServicing();
|
||||||
} else {
|
} else {
|
||||||
return {true, {}};
|
return {true, {}};
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,7 @@ protected:
|
||||||
|
|
||||||
void removeJob();
|
void removeJob();
|
||||||
void setJob(std::unique_ptr<ISocketMultiplexerJob>&& job);
|
void setJob(std::unique_ptr<ISocketMultiplexerJob>&& job);
|
||||||
|
MultiplexerJobStatus newJobOrStopServicing();
|
||||||
|
|
||||||
bool isReadable() { return m_readable; }
|
bool isReadable() { return m_readable; }
|
||||||
bool isWritable() { return m_writable; }
|
bool isWritable() { return m_writable; }
|
||||||
|
|
Loading…
Reference in New Issue