@@ -44,6 +44,9 @@ pub enum WaitStatus {
44
44
Exited ( pid_t , i8 ) ,
45
45
Signaled ( pid_t , Signal , bool ) ,
46
46
Stopped ( pid_t , Signal ) ,
47
+ #[ cfg( any( target_os = "linux" ,
48
+ target_os = "android" ) ) ]
49
+ PtraceEvent ( pid_t , Signal , c_int ) ,
47
50
Continued ( pid_t ) ,
48
51
StillAlive
49
52
}
@@ -52,6 +55,7 @@ pub enum WaitStatus {
52
55
target_os = "android" ) ) ]
53
56
mod status {
54
57
use sys:: signal:: Signal ;
58
+ use libc:: c_int;
55
59
56
60
pub fn exited ( status : i32 ) -> bool {
57
61
( status & 0x7F ) == 0
@@ -81,6 +85,10 @@ mod status {
81
85
Signal :: from_c_int ( ( status & 0xFF00 ) >> 8 ) . unwrap ( )
82
86
}
83
87
88
+ pub fn stop_additional ( status : i32 ) -> c_int {
89
+ ( status >> 16 ) as c_int
90
+ }
91
+
84
92
pub fn continued ( status : i32 ) -> bool {
85
93
status == 0xFFFF
86
94
}
@@ -184,6 +192,12 @@ fn decode(pid : pid_t, status: i32) -> WaitStatus {
184
192
} else if status:: signaled ( status) {
185
193
WaitStatus :: Signaled ( pid, status:: term_signal ( status) , status:: dumped_core ( status) )
186
194
} else if status:: stopped ( status) {
195
+ if cfg ! ( any( target_os = "linux" , target_os = "android" ) ) {
196
+ let status_additional = status:: stop_additional ( status) ;
197
+ if status_additional != 0 {
198
+ return WaitStatus :: PtraceEvent ( pid, status:: stop_signal ( status) , status:: stop_additional ( status) )
199
+ }
200
+ }
187
201
WaitStatus :: Stopped ( pid, status:: stop_signal ( status) )
188
202
} else {
189
203
assert ! ( status:: continued( status) ) ;
0 commit comments