Skip to content

Commit

Permalink
Auto merge of #438 - chaosagent:wait-ptrace, r=kamalmarhubi
Browse files Browse the repository at this point in the history
wait: Support ptrace events for Linux

Adds new WaitStatus value `PtraceEvent`. Implementation of #273 that only affects Linux/Android.
  • Loading branch information
homu committed Feb 14, 2017
2 parents 109b0e8 + e6bfbbb commit 7a91a81
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion src/sys/wait.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ pub enum WaitStatus {
Exited(pid_t, i8),
Signaled(pid_t, Signal, bool),
Stopped(pid_t, Signal),
#[cfg(any(target_os = "linux", target_os = "android"))]
PtraceEvent(pid_t, Signal, c_int),
Continued(pid_t),
StillAlive
}
Expand All @@ -52,6 +54,7 @@ pub enum WaitStatus {
target_os = "android"))]
mod status {
use sys::signal::Signal;
use libc::c_int;

pub fn exited(status: i32) -> bool {
(status & 0x7F) == 0
Expand Down Expand Up @@ -81,6 +84,10 @@ mod status {
Signal::from_c_int((status & 0xFF00) >> 8).unwrap()
}

pub fn stop_additional(status: i32) -> c_int {
(status >> 16) as c_int
}

pub fn continued(status: i32) -> bool {
status == 0xFFFF
}
Expand Down Expand Up @@ -184,7 +191,23 @@ fn decode(pid : pid_t, status: i32) -> WaitStatus {
} else if status::signaled(status) {
WaitStatus::Signaled(pid, status::term_signal(status), status::dumped_core(status))
} else if status::stopped(status) {
WaitStatus::Stopped(pid, status::stop_signal(status))
cfg_if! {
if #[cfg(any(target_os = "linux", target_os = "android"))] {
fn decode_stopped(pid: pid_t, status: i32) -> WaitStatus {
let status_additional = status::stop_additional(status);
if status_additional == 0 {
WaitStatus::Stopped(pid, status::stop_signal(status))
} else {
WaitStatus::PtraceEvent(pid, status::stop_signal(status), status::stop_additional(status))
}
}
} else {
fn decode_stopped(pid: pid_t, status: i32) -> WaitStatus {
WaitStatus::Stopped(pid, status::stop_signal(status))
}
}
}
decode_stopped(pid, status)
} else {
assert!(status::continued(status));
WaitStatus::Continued(pid)
Expand Down

0 comments on commit 7a91a81

Please sign in to comment.