Commit fdba503b2282a40c124066503de7cabe6afac7fa
1 parent
856bcc0a
fix(connection): respect disconnect() requests while connecting
Especially select() can take 100ms (as that is the timeout), after which a lot could have changed. So re-check the state if we aren't asked to disconnect before continueing.
Showing
1 changed file
with
17 additions
and
4 deletions
src/Connection.cpp
| @@ -198,7 +198,11 @@ void Connection::resolve() | @@ -198,7 +198,11 @@ void Connection::resolve() | ||
| 198 | return; | 198 | return; |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | - m_state = State::CONNECTING; | 201 | + // Only change the state if no disconnect() has been requested in the mean time. |
| 202 | + if (m_state != State::STOP) | ||
| 203 | + { | ||
| 204 | + m_state = State::CONNECTING; | ||
| 205 | + } | ||
| 202 | } | 206 | } |
| 203 | 207 | ||
| 204 | bool Connection::connectToAny() | 208 | bool Connection::connectToAny() |
| @@ -222,6 +226,11 @@ bool Connection::connectToAny() | @@ -222,6 +226,11 @@ bool Connection::connectToAny() | ||
| 222 | } | 226 | } |
| 223 | 227 | ||
| 224 | int result = select(FD_SETSIZE, nullptr, &write_fds, nullptr, &timeout); | 228 | int result = select(FD_SETSIZE, nullptr, &write_fds, nullptr, &timeout); |
| 229 | + // As we have waiting a bit, check if no disconnect has been requested. | ||
| 230 | + if (m_state == State::STOP) | ||
| 231 | + { | ||
| 232 | + return true; | ||
| 233 | + } | ||
| 225 | 234 | ||
| 226 | // Check if there was an error on select(). This is hard to recover from. | 235 | // Check if there was an error on select(). This is hard to recover from. |
| 227 | if (result < 0) | 236 | if (result < 0) |
| @@ -320,9 +329,13 @@ bool Connection::connectToAny() | @@ -320,9 +329,13 @@ bool Connection::connectToAny() | ||
| 320 | LOG_WARNING(this, "Could not set socket to non-blocking; expect performance impact"); | 329 | LOG_WARNING(this, "Could not set socket to non-blocking; expect performance impact"); |
| 321 | } | 330 | } |
| 322 | 331 | ||
| 323 | - m_socket = socket_connected; | ||
| 324 | - sendConnect(); | ||
| 325 | - m_state = State::AUTHENTICATING; | 332 | + // Only change the state if no disconnect() has been requested in the mean time. |
| 333 | + if (m_state != State::STOP) | ||
| 334 | + { | ||
| 335 | + m_state = State::AUTHENTICATING; | ||
| 336 | + m_socket = socket_connected; | ||
| 337 | + sendConnect(); | ||
| 338 | + } | ||
| 326 | return true; | 339 | return true; |
| 327 | } | 340 | } |
| 328 | 341 |