From dd052bd346ddd497ed79f771ea1d5b3406bbcf07 Mon Sep 17 00:00:00 2001 From: Pierre-Marc Fournier Date: Tue, 7 Jul 2009 18:14:19 -0400 Subject: [PATCH] Add SA_RESTART flag to signal handler With this flag, the kernel restarts automatically some system calls that were interrupted by the signal. Without this flag, these system calls would fail with errno = EINTR. Even with this flag, the kernel cannot restart some system calls, and developers should verify whether these system calls failed with EINTR and restart them manually in that case. For the list of system calls that cannot be restarted automatically, see signal(7). Because of this, we cannot completely eliminate the side-effects of liburcu on the application, but I think we should try our best and set SA_RESTART. From: Pierre-Marc Fournier Signed-off-by: Mathieu Desnoyers --- README | 8 ++++++++ urcu.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/README b/README index 71cf729..2fae654 100644 --- a/README +++ b/README @@ -29,6 +29,14 @@ Writing After, synchronize_rcu() must be called. When it returns, the old values are not in usage anymore. +Being careful with signals + + The library uses signals internally. The signal handler is + registered with the SA_RESTART flag. However, these signals may cause + some non-restartable system calls to fail with errno = EINTR. Care + should be taken to restart system calls manually if they fail with this + error. A list of non-restartable system calls may be found in + signal(7). Usage of DEBUG_FULL_MB diff --git a/urcu.c b/urcu.c index f219e76..51c279f 100644 --- a/urcu.c +++ b/urcu.c @@ -451,7 +451,7 @@ void urcu_init(void) init_done = 1; act.sa_sigaction = sigurcu_handler; - act.sa_flags = SA_SIGINFO; + act.sa_flags = SA_SIGINFO | SA_RESTART; sigemptyset(&act.sa_mask); ret = sigaction(SIGURCU, &act, NULL); if (ret) { -- 2.34.1