Skip to content

Commit 3453a8c

Browse files
committed
Fix test_thread_signal* test failures with Cargo 1.33.0
Previous versions of Cargo would create and destroy a new thread for each test. Cargo 1.33.0 instead creates a thread pool and reuses the same thread for multiple tests. Some Nix tests that changed the per-thread sigmask began to fail as a result, because they didn't do any cleanup. The easiest solution is to spawn a new thread for each of those tests.
1 parent 04e7551 commit 3453a8c

File tree

1 file changed

+71
-54
lines changed

1 file changed

+71
-54
lines changed

src/sys/signal.rs

Lines changed: 71 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,7 @@ mod sigevent {
833833

834834
#[cfg(test)]
835835
mod tests {
836+
use std::thread;
836837
use super::*;
837838

838839
#[test]
@@ -894,104 +895,120 @@ mod tests {
894895

895896
#[test]
896897
fn test_thread_signal_set_mask() {
897-
let prev_mask = SigSet::thread_get_mask().expect("Failed to get existing signal mask!");
898+
thread::spawn(|| {
899+
let prev_mask = SigSet::thread_get_mask()
900+
.expect("Failed to get existing signal mask!");
898901

899-
let mut test_mask = prev_mask;
900-
test_mask.add(SIGUSR1);
902+
let mut test_mask = prev_mask;
903+
test_mask.add(SIGUSR1);
901904

902-
assert!(test_mask.thread_set_mask().is_ok());
903-
let new_mask = SigSet::thread_get_mask().expect("Failed to get new mask!");
905+
assert!(test_mask.thread_set_mask().is_ok());
906+
let new_mask = SigSet::thread_get_mask()
907+
.expect("Failed to get new mask!");
904908

905-
assert!(new_mask.contains(SIGUSR1));
906-
assert!(!new_mask.contains(SIGUSR2));
909+
assert!(new_mask.contains(SIGUSR1));
910+
assert!(!new_mask.contains(SIGUSR2));
907911

908-
prev_mask.thread_set_mask().expect("Failed to revert signal mask!");
912+
prev_mask.thread_set_mask().expect("Failed to revert signal mask!");
913+
}).join().unwrap();
909914
}
910915

911916
#[test]
912917
fn test_thread_signal_block() {
913-
let mut mask = SigSet::empty();
914-
mask.add(SIGUSR1);
918+
thread::spawn(|| {
919+
let mut mask = SigSet::empty();
920+
mask.add(SIGUSR1);
915921

916-
assert!(mask.thread_block().is_ok());
922+
assert!(mask.thread_block().is_ok());
917923

918-
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
924+
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
925+
}).join().unwrap();
919926
}
920927

921928
#[test]
922929
fn test_thread_signal_unblock() {
923-
let mut mask = SigSet::empty();
924-
mask.add(SIGUSR1);
930+
thread::spawn(|| {
931+
let mut mask = SigSet::empty();
932+
mask.add(SIGUSR1);
925933

926-
assert!(mask.thread_unblock().is_ok());
934+
assert!(mask.thread_unblock().is_ok());
927935

928-
assert!(!SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
936+
assert!(!SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
937+
}).join().unwrap();
929938
}
930939

931940
#[test]
932941
fn test_thread_signal_swap() {
933-
let mut mask = SigSet::empty();
934-
mask.add(SIGUSR1);
935-
mask.thread_block().unwrap();
942+
thread::spawn(|| {
943+
let mut mask = SigSet::empty();
944+
mask.add(SIGUSR1);
945+
mask.thread_block().unwrap();
936946

937-
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
947+
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR1));
938948

939-
let mut mask2 = SigSet::empty();
940-
mask2.add(SIGUSR2);
949+
let mut mask2 = SigSet::empty();
950+
mask2.add(SIGUSR2);
941951

942-
let oldmask = mask2.thread_swap_mask(SigmaskHow::SIG_SETMASK).unwrap();
952+
let oldmask = mask2.thread_swap_mask(SigmaskHow::SIG_SETMASK)
953+
.unwrap();
943954

944-
assert!(oldmask.contains(SIGUSR1));
945-
assert!(!oldmask.contains(SIGUSR2));
955+
assert!(oldmask.contains(SIGUSR1));
956+
assert!(!oldmask.contains(SIGUSR2));
946957

947-
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR2));
958+
assert!(SigSet::thread_get_mask().unwrap().contains(SIGUSR2));
959+
}).join().unwrap();
948960
}
949961

950962
#[test]
951963
fn test_sigaction() {
952964
use libc;
965+
thread::spawn(|| {
966+
extern fn test_sigaction_handler(_: libc::c_int) {}
967+
extern fn test_sigaction_action(_: libc::c_int,
968+
_: *mut libc::siginfo_t, _: *mut libc::c_void) {}
953969

954-
extern fn test_sigaction_handler(_: libc::c_int) {}
955-
extern fn test_sigaction_action(_: libc::c_int,
956-
_: *mut libc::siginfo_t, _: *mut libc::c_void) {}
957-
958-
let handler_sig = SigHandler::Handler(test_sigaction_handler);
970+
let handler_sig = SigHandler::Handler(test_sigaction_handler);
959971

960-
let flags = SaFlags::SA_ONSTACK | SaFlags::SA_RESTART | SaFlags::SA_SIGINFO;
972+
let flags = SaFlags::SA_ONSTACK | SaFlags::SA_RESTART |
973+
SaFlags::SA_SIGINFO;
961974

962-
let mut mask = SigSet::empty();
963-
mask.add(SIGUSR1);
975+
let mut mask = SigSet::empty();
976+
mask.add(SIGUSR1);
964977

965-
let action_sig = SigAction::new(handler_sig, flags, mask);
978+
let action_sig = SigAction::new(handler_sig, flags, mask);
966979

967-
assert_eq!(action_sig.flags(), SaFlags::SA_ONSTACK | SaFlags::SA_RESTART);
968-
assert_eq!(action_sig.handler(), handler_sig);
980+
assert_eq!(action_sig.flags(),
981+
SaFlags::SA_ONSTACK | SaFlags::SA_RESTART);
982+
assert_eq!(action_sig.handler(), handler_sig);
969983

970-
mask = action_sig.mask();
971-
assert!(mask.contains(SIGUSR1));
972-
assert!(!mask.contains(SIGUSR2));
984+
mask = action_sig.mask();
985+
assert!(mask.contains(SIGUSR1));
986+
assert!(!mask.contains(SIGUSR2));
973987

974-
let handler_act = SigHandler::SigAction(test_sigaction_action);
975-
let action_act = SigAction::new(handler_act, flags, mask);
976-
assert_eq!(action_act.handler(), handler_act);
988+
let handler_act = SigHandler::SigAction(test_sigaction_action);
989+
let action_act = SigAction::new(handler_act, flags, mask);
990+
assert_eq!(action_act.handler(), handler_act);
977991

978-
let action_dfl = SigAction::new(SigHandler::SigDfl, flags, mask);
979-
assert_eq!(action_dfl.handler(), SigHandler::SigDfl);
992+
let action_dfl = SigAction::new(SigHandler::SigDfl, flags, mask);
993+
assert_eq!(action_dfl.handler(), SigHandler::SigDfl);
980994

981-
let action_ign = SigAction::new(SigHandler::SigIgn, flags, mask);
982-
assert_eq!(action_ign.handler(), SigHandler::SigIgn);
995+
let action_ign = SigAction::new(SigHandler::SigIgn, flags, mask);
996+
assert_eq!(action_ign.handler(), SigHandler::SigIgn);
997+
}).join().unwrap();
983998
}
984999

9851000
// TODO(#251): Re-enable after figuring out flakiness.
9861001
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
9871002
#[test]
9881003
fn test_sigwait() {
989-
let mut mask = SigSet::empty();
990-
mask.add(SIGUSR1);
991-
mask.add(SIGUSR2);
992-
mask.thread_block().unwrap();
993-
994-
raise(SIGUSR1).unwrap();
995-
assert_eq!(mask.wait().unwrap(), SIGUSR1);
1004+
thread::spawn(|| {
1005+
let mut mask = SigSet::empty();
1006+
mask.add(SIGUSR1);
1007+
mask.add(SIGUSR2);
1008+
mask.thread_block().unwrap();
1009+
1010+
raise(SIGUSR1).unwrap();
1011+
assert_eq!(mask.wait().unwrap(), SIGUSR1);
1012+
}).join().unwrap();
9961013
}
9971014
}

0 commit comments

Comments
 (0)