Fix crash during reconnect

This commit is contained in:
badaix 2025-02-06 21:09:17 +01:00 committed by Johannes Pohl
parent e480268097
commit b566b42ee0
2 changed files with 12 additions and 3 deletions

View file

@ -79,10 +79,15 @@ uint16_t PendingRequest::id() const
void PendingRequest::startTimer(const chronos::usec& timeout) void PendingRequest::startTimer(const chronos::usec& timeout)
{ {
timer_.expires_after(timeout); timer_.expires_after(timeout);
timer_.async_wait([this, self = shared_from_this()](boost::system::error_code ec) timer_.async_wait([this, me = weak_from_this()](boost::system::error_code ec)
{ {
auto self = me.lock();
if (!self)
return;
if (!handler_) if (!handler_)
return; return;
if (!ec) if (!ec)
{ {
// !ec => expired => timeout // !ec => expired => timeout
@ -581,6 +586,7 @@ void ClientConnectionWss::disconnect()
getWs().next_layer().lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); getWs().next_layer().lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
getWs().next_layer().lowest_layer().close(ec); getWs().next_layer().lowest_layer().close(ec);
} }
boost::asio::post(strand_, [this]() { pendingRequests_.clear(); }); boost::asio::post(strand_, [this]() { pendingRequests_.clear(); });
ssl_ws_ = std::nullopt; ssl_ws_ = std::nullopt;
LOG(DEBUG, LOG_TAG) << "Disconnected\n"; LOG(DEBUG, LOG_TAG) << "Disconnected\n";

View file

@ -169,6 +169,7 @@ void Controller::getNextMessage()
{ {
if (ec) if (ec)
{ {
LOG(ERROR, LOG_TAG) << "Error receiving next message: " << ec << "\n";
reconnect(); reconnect();
return; return;
} }
@ -425,6 +426,7 @@ void Controller::start()
void Controller::reconnect() void Controller::reconnect()
{ {
LOG(INFO, LOG_TAG) << "Reconnecting\n";
timer_.cancel(); timer_.cancel();
clientConnection_->disconnect(); clientConnection_->disconnect();
player_.reset(); player_.reset();
@ -467,11 +469,12 @@ void Controller::worker()
serverSettings_ = std::move(response); serverSettings_ = std::move(response);
LOG(INFO, LOG_TAG) << "ServerSettings - buffer: " << serverSettings_->getBufferMs() << ", latency: " << serverSettings_->getLatency() LOG(INFO, LOG_TAG) << "ServerSettings - buffer: " << serverSettings_->getBufferMs() << ", latency: " << serverSettings_->getLatency()
<< ", volume: " << serverSettings_->getVolume() << ", muted: " << serverSettings_->isMuted() << "\n"; << ", volume: " << serverSettings_->getVolume() << ", muted: " << serverSettings_->isMuted() << "\n";
// Do initial time sync with the server
sendTimeSyncMessage(50);
} }
}); });
// Do initial time sync with the server
sendTimeSyncMessage(50);
// Start receiver loop // Start receiver loop
getNextMessage(); getNextMessage();
} }