mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2025-01-31 19:55:38 +00:00
Sockets: Properly handle POLLHUP events
Stops client socket leaking.
This commit is contained in:
parent
6b78364eab
commit
78800870bc
|
@ -486,10 +486,17 @@ bool SocketMultiplexer::PollEventsWithTimeout(u32 milliseconds)
|
||||||
PendingSocketPair& psp = triggered_sockets[i];
|
PendingSocketPair& psp = triggered_sockets[i];
|
||||||
|
|
||||||
// fire events
|
// fire events
|
||||||
if (psp.second & (POLLIN | POLLHUP | POLLERR))
|
if (psp.second & (POLLHUP | POLLERR))
|
||||||
psp.first->OnReadEvent();
|
{
|
||||||
if (psp.second & POLLOUT)
|
psp.first->OnHangupEvent();
|
||||||
psp.first->OnWriteEvent();
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (psp.second & POLLIN)
|
||||||
|
psp.first->OnReadEvent();
|
||||||
|
if (psp.second & POLLOUT)
|
||||||
|
psp.first->OnWriteEvent();
|
||||||
|
}
|
||||||
|
|
||||||
psp.first.~shared_ptr();
|
psp.first.~shared_ptr();
|
||||||
}
|
}
|
||||||
|
@ -558,6 +565,12 @@ void ListenSocket::OnReadEvent()
|
||||||
|
|
||||||
void ListenSocket::OnWriteEvent()
|
void ListenSocket::OnWriteEvent()
|
||||||
{
|
{
|
||||||
|
ERROR_LOG("Unexpected OnWriteEvent() in ListenSocket {}", m_local_address.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ListenSocket::OnHangupEvent()
|
||||||
|
{
|
||||||
|
ERROR_LOG("Unexpected OnHangupEvent() in ListenSocket {}", m_local_address.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamSocket::StreamSocket(SocketMultiplexer& multiplexer, SocketDescriptor descriptor)
|
StreamSocket::StreamSocket(SocketMultiplexer& multiplexer, SocketDescriptor descriptor)
|
||||||
|
@ -770,6 +783,21 @@ void StreamSocket::OnWriteEvent()
|
||||||
// shouldn't be called
|
// shouldn't be called
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StreamSocket::OnHangupEvent()
|
||||||
|
{
|
||||||
|
std::unique_lock lock(m_lock);
|
||||||
|
if (!m_connected)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_multiplexer.SetNotificationMask(this, m_descriptor, 0);
|
||||||
|
m_multiplexer.RemoveClientSocket(this);
|
||||||
|
closesocket(m_descriptor);
|
||||||
|
m_descriptor = INVALID_SOCKET;
|
||||||
|
m_connected = false;
|
||||||
|
|
||||||
|
OnDisconnected(Error::CreateString("Connection closed by peer."));
|
||||||
|
}
|
||||||
|
|
||||||
BufferedStreamSocket::BufferedStreamSocket(SocketMultiplexer& multiplexer, SocketDescriptor descriptor,
|
BufferedStreamSocket::BufferedStreamSocket(SocketMultiplexer& multiplexer, SocketDescriptor descriptor,
|
||||||
size_t receive_buffer_size /* = 16384 */,
|
size_t receive_buffer_size /* = 16384 */,
|
||||||
size_t send_buffer_size /* = 16384 */)
|
size_t send_buffer_size /* = 16384 */)
|
||||||
|
|
|
@ -79,6 +79,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
virtual void OnReadEvent() = 0;
|
virtual void OnReadEvent() = 0;
|
||||||
virtual void OnWriteEvent() = 0;
|
virtual void OnWriteEvent() = 0;
|
||||||
|
virtual void OnHangupEvent() = 0;
|
||||||
|
|
||||||
SocketMultiplexer& m_multiplexer;
|
SocketMultiplexer& m_multiplexer;
|
||||||
SocketDescriptor m_descriptor;
|
SocketDescriptor m_descriptor;
|
||||||
|
@ -194,6 +195,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void OnReadEvent() override final;
|
void OnReadEvent() override final;
|
||||||
void OnWriteEvent() override final;
|
void OnWriteEvent() override final;
|
||||||
|
void OnHangupEvent() override final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SocketMultiplexer::CreateStreamSocketCallback m_accept_callback;
|
SocketMultiplexer::CreateStreamSocketCallback m_accept_callback;
|
||||||
|
@ -231,6 +233,7 @@ protected:
|
||||||
|
|
||||||
virtual void OnReadEvent() override;
|
virtual void OnReadEvent() override;
|
||||||
virtual void OnWriteEvent() override;
|
virtual void OnWriteEvent() override;
|
||||||
|
virtual void OnHangupEvent() override;
|
||||||
|
|
||||||
void CloseWithError();
|
void CloseWithError();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue