mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 04:58:13 +00:00
NotificationServer: Close connection on notification close
When the notification was closed, the connection was kept around. This caused the core event loop to take up nearly all CPU, so instead of checking the connection we clear it on close and add state variables to check state.
This commit is contained in:
parent
9d09594e44
commit
ddcef0452a
2 changed files with 33 additions and 12 deletions
|
@ -34,23 +34,28 @@ namespace GUI {
|
|||
class NotificationServerConnection : public IPC::ServerConnection<NotificationClientEndpoint, NotificationServerEndpoint>
|
||||
, public NotificationClientEndpoint {
|
||||
C_OBJECT(NotificationServerConnection)
|
||||
|
||||
friend class Notification;
|
||||
|
||||
public:
|
||||
virtual void handshake() override
|
||||
{
|
||||
send_sync<Messages::NotificationServer::Greet>();
|
||||
}
|
||||
|
||||
virtual void die() override { m_connected = false; }
|
||||
|
||||
bool is_connected() const { return m_connected; }
|
||||
virtual void die() override
|
||||
{
|
||||
m_notification->connection_closed();
|
||||
}
|
||||
|
||||
private:
|
||||
NotificationServerConnection()
|
||||
explicit NotificationServerConnection(Notification* notification)
|
||||
: IPC::ServerConnection<NotificationClientEndpoint, NotificationServerEndpoint>(*this, "/tmp/portal/notify")
|
||||
, m_notification(notification)
|
||||
{
|
||||
}
|
||||
virtual void handle(const Messages::NotificationClient::Dummy&) override { }
|
||||
bool m_connected { true };
|
||||
Notification* m_notification;
|
||||
};
|
||||
|
||||
Notification::Notification()
|
||||
|
@ -63,25 +68,27 @@ Notification::~Notification()
|
|||
|
||||
void Notification::show()
|
||||
{
|
||||
VERIFY(!m_connection);
|
||||
VERIFY(!m_shown && !m_destroyed);
|
||||
auto icon = m_icon ? m_icon->to_shareable_bitmap() : Gfx::ShareableBitmap();
|
||||
m_connection = NotificationServerConnection::construct();
|
||||
m_connection = NotificationServerConnection::construct(this);
|
||||
m_connection->send_sync<Messages::NotificationServer::ShowNotification>(m_text, m_title, icon);
|
||||
m_shown = true;
|
||||
}
|
||||
|
||||
void Notification::close()
|
||||
{
|
||||
VERIFY(m_connection);
|
||||
if (!m_connection->is_connected()) {
|
||||
VERIFY(m_shown);
|
||||
if (!m_destroyed) {
|
||||
m_connection->send_sync<Messages::NotificationServer::CloseNotification>();
|
||||
connection_closed();
|
||||
return;
|
||||
}
|
||||
m_connection->send_sync<Messages::NotificationServer::CloseNotification>();
|
||||
}
|
||||
|
||||
bool Notification::update()
|
||||
{
|
||||
VERIFY(m_connection);
|
||||
if (!m_connection->is_connected()) {
|
||||
VERIFY(m_shown);
|
||||
if (m_destroyed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -99,4 +106,10 @@ bool Notification::update()
|
|||
return true;
|
||||
}
|
||||
|
||||
void Notification::connection_closed()
|
||||
{
|
||||
m_connection.clear();
|
||||
m_destroyed = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue