@@ -10,9 +10,9 @@ cfg_if::cfg_if! {
1010 } else if #[ cfg( target_os = "linux" ) ] {
1111 /// Mitigation for <https://github.com/rust-lang/rust/issues/126600>
1212 ///
13- /// On `unix` (where `libc::exit` may not be thread-safe), ensure that only one Rust thread
14- /// calls `libc::exit` (or returns from `main`) by calling this function before calling
15- /// `libc::exit` (or returning from `main`).
13+ /// On UNIX-like platforms (where `libc::exit` may not be thread-safe), ensure that only one
14+ /// Rust thread calls `libc::exit` (or returns from `main`) by calling this function before
15+ /// calling `libc::exit` (or returning from `main`).
1616 ///
1717 /// Technically not enough to ensure soundness, since other code directly calling
1818 /// libc::exit will still race with this.
@@ -23,7 +23,7 @@ cfg_if::cfg_if! {
2323 /// This function will return only the first time it is called in a process.
2424 ///
2525 /// * If it is called again on the same thread as the first call, it will abort.
26- /// * If it is called again on a different thread, it will `thread::park()` in a loop
26+ /// * If it is called again on a different thread, it will wait in a loop
2727 /// (waiting for the process to exit).
2828 pub ( crate ) fn unique_thread_exit( ) {
2929 let this_thread_id = unsafe { libc:: gettid( ) } ;
@@ -52,9 +52,10 @@ cfg_if::cfg_if! {
5252 }
5353 Err ( _) => {
5454 // This is not the first thread to call `unique_thread_exit`.
55- // Park until the process exits.
55+ // Pause until the process exits.
5656 loop {
57- crate :: thread:: park( ) ;
57+ // Safety: libc::pause is safe to call.
58+ unsafe { libc:: pause( ) ; }
5859 }
5960 }
6061 }
@@ -77,10 +78,12 @@ cfg_if::cfg_if! {
7778 core:: panicking:: panic_nounwind( "std::process::exit called re-entrantly" )
7879 } else {
7980 // This is not the first thread to call `unique_thread_exit`.
81+ // Pause until the process exits.
8082 // Park until the process exits.
8183 drop( exiting_thread_id) ;
8284 loop {
83- crate :: thread:: park( ) ;
85+ // Safety: libc::pause is safe to call.
86+ unsafe { libc:: pause( ) ; }
8487 }
8588 }
8689 }
0 commit comments