From 9fd681ca97f2d27014782713fb52a7a8331454b4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 24 Feb 2011 14:21:55 +0000 Subject: [PATCH 3/4] bus: signal_handler: ignore failure to write, and explain why See the comment in the source code for rationale. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=33336 --- bus/main.c | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-) diff --git a/bus/main.c b/bus/main.c index 1af588e..136d122 100644 --- a/bus/main.c +++ b/bus/main.c @@ -44,7 +44,6 @@ static int reload_pipe[2]; #define RELOAD_WRITE_END 1 static void close_reload_pipe (DBusWatch **); -static void close_reload_pipe_write (void); static void signal_handler (int sig) @@ -64,8 +63,14 @@ signal_handler (int sig) if ((reload_pipe[RELOAD_WRITE_END] > 0) && !_dbus_write_socket (reload_pipe[RELOAD_WRITE_END], &str, 0, 1)) { + /* If we receive SIGHUP often enough to fill the pipe buffer (4096 + * times on old Linux, 65536 on modern Linux) before it can be + * drained, let's just warn and ignore. The configuration will be + * reloaded while draining the pipe buffer, which is what we + * wanted. It's harmless that it will be reloaded fewer times than + * we asked for, since the reload is delayed anyway, so new changes + * will be picked up. */ _dbus_warn ("Unable to write to reload pipe.\n"); - close_reload_pipe_write (); } } break; @@ -261,13 +266,6 @@ close_reload_pipe (DBusWatch **watch) _dbus_close_socket (reload_pipe[RELOAD_READ_END], NULL); reload_pipe[RELOAD_READ_END] = -1; - close_reload_pipe_write (); -} - -/* this is the only bit that's safe to do from an async signal handler */ -static void -close_reload_pipe_write (void) -{ _dbus_close_socket (reload_pipe[RELOAD_WRITE_END], NULL); reload_pipe[RELOAD_WRITE_END] = -1; } -- 1.7.4.1