mirror of
https://github.com/swaywm/sway.git
synced 2024-11-12 21:43:59 +01:00
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.
This commit is contained in:
parent
63345977e2
commit
00e9a94152
@ -508,7 +508,7 @@ void bar_run(struct swaybar *bar) {
|
||||
}
|
||||
#if HAVE_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
|
||||
while (bar->running) {
|
||||
|
@ -518,8 +518,7 @@ static bool handle_barconfig_update(struct swaybar *bar, const char *payload,
|
||||
#if HAVE_TRAY
|
||||
if (oldcfg->tray_hidden && !newcfg->tray_hidden) {
|
||||
bar->tray = create_tray(bar);
|
||||
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);
|
||||
} else if (bar->tray && newcfg->tray_hidden) {
|
||||
loop_remove_fd(bar->eventloop, bar->tray->fd);
|
||||
destroy_tray(bar->tray);
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include <cairo.h>
|
||||
#include <poll.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -90,9 +91,16 @@ void destroy_tray(struct swaybar_tray *tray) {
|
||||
}
|
||||
|
||||
void tray_in(int fd, short mask, void *data) {
|
||||
sd_bus *bus = data;
|
||||
struct swaybar *bar = data;
|
||||
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
|
||||
}
|
||||
if (ret < 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user