From 2aa5e7731692ca6164093ce954c61fc9e2bb17b5 Mon Sep 17 00:00:00 2001 From: Philipp Matthias Schaefer Date: Wed, 20 Jan 2016 20:59:45 +0100 Subject: [PATCH 1/2] Account for the different signal handler types. --- src/sys/signal.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/sys/signal.rs b/src/sys/signal.rs index 9cf99ba4c4..5e13cb5037 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -464,6 +464,15 @@ impl AsRef for SigSet { } } +pub use self::signal::siginfo; + +pub enum SigHandler { + SigDfl, + SigIgn, + Handler(extern fn(SigNum)), + SigAction(extern fn(SigNum, *mut siginfo, *mut libc::c_void)) +} + type sigaction_t = self::signal::sigaction; pub struct SigAction { @@ -471,9 +480,14 @@ pub struct SigAction { } impl SigAction { - pub fn new(handler: extern fn(libc::c_int), flags: SockFlag, mask: SigSet) -> SigAction { + pub fn new(handler: SigHandler, flags: SockFlag, mask: SigSet) -> SigAction { let mut s = unsafe { mem::uninitialized::() }; - s.sa_handler = handler; + s.sa_handler = match handler { + SigHandler::SigDfl => unsafe { mem::transmute(libc::SIG_DFL) }, + SigHandler::SigIgn => unsafe { mem::transmute(libc::SIG_IGN) }, + SigHandler::Handler(f) => f, + SigHandler::SigAction(f) => unsafe { mem::transmute(f) }, + }; s.sa_flags = flags; s.sa_mask = mask.sigset; From 599e6e2eadfddb64cb395fb942e93ad85df1b99d Mon Sep 17 00:00:00 2001 From: Philipp Matthias Schaefer Date: Mon, 1 Feb 2016 19:29:53 +0100 Subject: [PATCH 2/2] Handle `SA_SIGINFO` flag in the constructor. If someone creates so many SigAction structs, that a few extra instructions per object creation create a performance problem, we could still provide an unsafe variant, that let's the user take care of the flag. --- src/sys/signal.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sys/signal.rs b/src/sys/signal.rs index 5e13cb5037..f11b663331 100644 --- a/src/sys/signal.rs +++ b/src/sys/signal.rs @@ -480,6 +480,8 @@ pub struct SigAction { } impl SigAction { + /// This function will set or unset the flag `SA_SIGINFO` depending on the + /// type of the `handler` argument. pub fn new(handler: SigHandler, flags: SockFlag, mask: SigSet) -> SigAction { let mut s = unsafe { mem::uninitialized::() }; s.sa_handler = match handler { @@ -488,7 +490,10 @@ impl SigAction { SigHandler::Handler(f) => f, SigHandler::SigAction(f) => unsafe { mem::transmute(f) }, }; - s.sa_flags = flags; + s.sa_flags = match handler { + SigHandler::SigAction(_) => flags | SA_SIGINFO, + _ => flags - SA_SIGINFO, + }; s.sa_mask = mask.sigset; SigAction { sigaction: s }