From 04e8fb958c60904307e61bb00ca325009dbe23d7 Mon Sep 17 00:00:00 2001 From: Dmitry Ivanov Date: Tue, 25 Oct 2022 14:20:06 +0300 Subject: [PATCH] Restart syscalls interrupted by SIGPROF when possible Signed-off-by: Dmitry Ivanov --- src/profiler.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/profiler.rs b/src/profiler.rs index 4bc72ad2..e2a12fc2 100644 --- a/src/profiler.rs +++ b/src/profiler.rs @@ -374,7 +374,9 @@ impl Profiler { let handler = signal::SigHandler::SigAction(perf_signal_handler); let sigaction = signal::SigAction::new( handler, - signal::SaFlags::SA_SIGINFO, + // SA_RESTART will only restart a syscall when it's safe to do so, + // e.g. when it's a blocking read(2) or write(2). See man 7 signal. + signal::SaFlags::SA_SIGINFO | signal::SaFlags::SA_RESTART, signal::SigSet::empty(), ); unsafe { signal::sigaction(signal::SIGPROF, &sigaction) }?;