swaybar: Fix 100% cpu usage if dbus dies.

Currently, swaybar does not gracefully die if it detects
that the dbus connection was lost. Although it's not recommended
to restart dbus without restarting the compositor, it can very
easily happen. In the case it does, compositor's tray should
not consume 100% cpu until it has to be force killed.

apply suggestions

just setting the bar to not running will call teardown and unref the
dbus.

(cherry picked from commit 00e9a94152)
This commit is contained in:
Furkan Sahin 2024-09-25 06:35:30 -05:00 committed by Simon Ser
parent 75cfed65bb
commit 1311685d1c
3 changed files with 12 additions and 5 deletions

View file

@ -508,7 +508,7 @@ void bar_run(struct swaybar *bar) {
} }
#if HAVE_TRAY #if HAVE_TRAY
if (bar->tray) { if (bar->tray) {
loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus); loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar);
} }
#endif #endif
while (bar->running) { while (bar->running) {

View file

@ -518,8 +518,7 @@ static bool handle_barconfig_update(struct swaybar *bar, const char *payload,
#if HAVE_TRAY #if HAVE_TRAY
if (oldcfg->tray_hidden && !newcfg->tray_hidden) { if (oldcfg->tray_hidden && !newcfg->tray_hidden) {
bar->tray = create_tray(bar); bar->tray = create_tray(bar);
loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar);
bar->tray->bus);
} else if (bar->tray && newcfg->tray_hidden) { } else if (bar->tray && newcfg->tray_hidden) {
loop_remove_fd(bar->eventloop, bar->tray->fd); loop_remove_fd(bar->eventloop, bar->tray->fd);
destroy_tray(bar->tray); destroy_tray(bar->tray);

View file

@ -1,4 +1,5 @@
#include <cairo.h> #include <cairo.h>
#include <poll.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -90,9 +91,16 @@ void destroy_tray(struct swaybar_tray *tray) {
} }
void tray_in(int fd, short mask, void *data) { void tray_in(int fd, short mask, void *data) {
sd_bus *bus = data; struct swaybar *bar = data;
int ret; int ret;
while ((ret = sd_bus_process(bus, NULL)) > 0) {
if (mask & (POLLHUP | POLLERR)) {
sway_log(SWAY_ERROR, "D-Bus connection closed unexpectedly");
bar->running = false;
return;
}
while ((ret = sd_bus_process(bar->tray->bus, NULL)) > 0) {
// This space intentionally left blank // This space intentionally left blank
} }
if (ret < 0) { if (ret < 0) {