@@ -44,6 +44,8 @@ pub enum WaitStatus {
4444 Exited ( pid_t , i8 ) ,
4545 Signaled ( pid_t , Signal , bool ) ,
4646 Stopped ( pid_t , Signal ) ,
47+ #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
48+ PtraceEvent ( pid_t , Signal , c_int ) ,
4749 Continued ( pid_t ) ,
4850 StillAlive
4951}
@@ -52,6 +54,7 @@ pub enum WaitStatus {
5254 target_os = "android" ) ) ]
5355mod status {
5456 use sys:: signal:: Signal ;
57+ use libc:: c_int;
5558
5659 pub fn exited ( status : i32 ) -> bool {
5760 ( status & 0x7F ) == 0
@@ -81,6 +84,10 @@ mod status {
8184 Signal :: from_c_int ( ( status & 0xFF00 ) >> 8 ) . unwrap ( )
8285 }
8386
87+ pub fn stop_additional ( status : i32 ) -> c_int {
88+ ( status >> 16 ) as c_int
89+ }
90+
8491 pub fn continued ( status : i32 ) -> bool {
8592 status == 0xFFFF
8693 }
@@ -184,6 +191,12 @@ fn decode(pid : pid_t, status: i32) -> WaitStatus {
184191 } else if status:: signaled ( status) {
185192 WaitStatus :: Signaled ( pid, status:: term_signal ( status) , status:: dumped_core ( status) )
186193 } else if status:: stopped ( status) {
194+ if cfg ! ( any( target_os = "linux" , target_os = "android" ) ) {
195+ let status_additional = status:: stop_additional ( status) ;
196+ if status_additional != 0 {
197+ return WaitStatus :: PtraceEvent ( pid, status:: stop_signal ( status) , status:: stop_additional ( status) )
198+ }
199+ }
187200 WaitStatus :: Stopped ( pid, status:: stop_signal ( status) )
188201 } else {
189202 assert ! ( status:: continued( status) ) ;
0 commit comments