mirror of
https://github.com/RGBCube/serenity
synced 2025-06-24 21:42:10 +00:00
LibIPC: Make noise when shutting down because of an error
Previously, an IPC connection error could shut down the entire process without giving a hint as to what's wrong. Now, we report that error to the debug console.
This commit is contained in:
parent
1f736ced08
commit
a39c38840e
3 changed files with 11 additions and 7 deletions
|
@ -39,8 +39,7 @@ ErrorOr<void> ConnectionBase::post_message(MessageBuffer buffer)
|
||||||
#ifdef __serenity__
|
#ifdef __serenity__
|
||||||
for (auto& fd : buffer.fds) {
|
for (auto& fd : buffer.fds) {
|
||||||
if (auto result = m_socket->send_fd(fd.value()); result.is_error()) {
|
if (auto result = m_socket->send_fd(fd.value()); result.is_error()) {
|
||||||
dbgln("{}", result.error());
|
shutdown_with_error(result.error());
|
||||||
shutdown();
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,15 +54,13 @@ ErrorOr<void> ConnectionBase::post_message(MessageBuffer buffer)
|
||||||
if (maybe_nwritten.is_error()) {
|
if (maybe_nwritten.is_error()) {
|
||||||
auto error = maybe_nwritten.release_error();
|
auto error = maybe_nwritten.release_error();
|
||||||
if (error.is_errno()) {
|
if (error.is_errno()) {
|
||||||
|
shutdown_with_error(error);
|
||||||
switch (error.code()) {
|
switch (error.code()) {
|
||||||
case EPIPE:
|
case EPIPE:
|
||||||
shutdown();
|
|
||||||
return Error::from_string_literal("IPC::Connection::post_message: Disconnected from peer"sv);
|
return Error::from_string_literal("IPC::Connection::post_message: Disconnected from peer"sv);
|
||||||
case EAGAIN:
|
case EAGAIN:
|
||||||
shutdown();
|
|
||||||
return Error::from_string_literal("IPC::Connection::post_message: Peer buffer overflowed"sv);
|
return Error::from_string_literal("IPC::Connection::post_message: Peer buffer overflowed"sv);
|
||||||
default:
|
default:
|
||||||
shutdown();
|
|
||||||
return Error::from_syscall("IPC::Connection::post_message write"sv, -error.code());
|
return Error::from_syscall("IPC::Connection::post_message write"sv, -error.code());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -84,6 +81,12 @@ void ConnectionBase::shutdown()
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ConnectionBase::shutdown_with_error(Error const& error)
|
||||||
|
{
|
||||||
|
dbgln("IPC::ConnectionBase ({:p}) had an error ({}), disconnecting.", this, error);
|
||||||
|
shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
void ConnectionBase::handle_messages()
|
void ConnectionBase::handle_messages()
|
||||||
{
|
{
|
||||||
auto messages = move(m_unprocessed_messages);
|
auto messages = move(m_unprocessed_messages);
|
||||||
|
|
|
@ -47,6 +47,7 @@ protected:
|
||||||
virtual void may_have_become_unresponsive() { }
|
virtual void may_have_become_unresponsive() { }
|
||||||
virtual void did_become_responsive() { }
|
virtual void did_become_responsive() { }
|
||||||
virtual void try_parse_messages(Vector<u8> const& bytes, size_t& index) = 0;
|
virtual void try_parse_messages(Vector<u8> const& bytes, size_t& index) = 0;
|
||||||
|
virtual void shutdown_with_error(Error const&);
|
||||||
|
|
||||||
OwnPtr<IPC::Message> wait_for_specific_endpoint_message_impl(u32 endpoint_magic, int message_id);
|
OwnPtr<IPC::Message> wait_for_specific_endpoint_message_impl(u32 endpoint_magic, int message_id);
|
||||||
void wait_for_socket_to_become_readable();
|
void wait_for_socket_to_become_readable();
|
||||||
|
|
|
@ -52,9 +52,9 @@ public:
|
||||||
this->shutdown();
|
this->shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void shutdown_with_error(Error const& error)
|
virtual void shutdown_with_error(Error const& error) override
|
||||||
{
|
{
|
||||||
dbgln("{} (id={}) had error ({}), disconnecting.", *this, m_client_id, error);
|
dbgln("{} (id={}) had an error ({}), disconnecting.", *this, m_client_id, error);
|
||||||
this->shutdown();
|
this->shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue