Merge pull request #2368 from RyanDwyer/handle-out-of-fds

Handle out-of-fd situations gracefully for transaction and urgent timers
This commit is contained in:
Drew DeVault 2018-07-28 09:05:28 -04:00 committed by GitHub
commit e4b54ac16e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 3 deletions

View file

@ -1,4 +1,5 @@
#define _POSIX_C_SOURCE 200809L #define _POSIX_C_SOURCE 200809L
#include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -316,7 +317,14 @@ static void transaction_commit(struct sway_transaction *transaction) {
// Set up a timer which the views must respond within // Set up a timer which the views must respond within
transaction->timer = wl_event_loop_add_timer(server.wl_event_loop, transaction->timer = wl_event_loop_add_timer(server.wl_event_loop,
handle_timeout, transaction); handle_timeout, transaction);
wl_event_source_timer_update(transaction->timer, txn_timeout_ms); if (transaction->timer) {
wl_event_source_timer_update(transaction->timer, txn_timeout_ms);
} else {
wlr_log(WLR_ERROR, "Unable to create transaction timer (%s). "
"Some imperfect frames might be rendered.",
strerror(errno));
handle_timeout(transaction);
}
} }
// The debug tree shows the pending/live tree. Here is a good place to // The debug tree shows the pending/live tree. Here is a good place to

View file

@ -1,6 +1,7 @@
#define _XOPEN_SOURCE 700 #define _XOPEN_SOURCE 700
#define _POSIX_C_SOURCE 199309L #define _POSIX_C_SOURCE 199309L
#include <assert.h> #include <assert.h>
#include <errno.h>
#ifdef __linux__ #ifdef __linux__
#include <linux/input-event-codes.h> #include <linux/input-event-codes.h>
#elif __FreeBSD__ #elif __FreeBSD__
@ -696,8 +697,14 @@ void seat_set_focus_warp(struct sway_seat *seat,
config->urgent_timeout > 0) { config->urgent_timeout > 0) {
view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop,
handle_urgent_timeout, view); handle_urgent_timeout, view);
wl_event_source_timer_update(view->urgent_timer, if (view->urgent_timer) {
config->urgent_timeout); wl_event_source_timer_update(view->urgent_timer,
config->urgent_timeout);
} else {
wlr_log(WLR_ERROR, "Unable to create urgency timer (%s)",
strerror(errno));
handle_urgent_timeout(view);
}
} else { } else {
view_set_urgent(view, false); view_set_urgent(view, false);
} }