std: Move platform-specific out of sys_common::util
This commit is contained in:
parent
219c018894
commit
f3a709dc52
@ -33,32 +33,6 @@ pub fn dumb_print(args: fmt::Arguments) {
|
||||
let _ = Stderr::new().map(|mut stderr| stderr.write_fmt(args));
|
||||
}
|
||||
|
||||
// On Unix-like platforms, libc::abort will unregister signal handlers
|
||||
// including the SIGABRT handler, preventing the abort from being blocked, and
|
||||
// fclose streams, with the side effect of flushing them so libc bufferred
|
||||
// output will be printed. Additionally the shell will generally print a more
|
||||
// understandable error message like "Abort trap" rather than "Illegal
|
||||
// instruction" that intrinsics::abort would cause, as intrinsics::abort is
|
||||
// implemented as an illegal instruction.
|
||||
#[cfg(unix)]
|
||||
unsafe fn abort_internal() -> ! {
|
||||
::libc::abort()
|
||||
}
|
||||
|
||||
// On Windows, use the processor-specific __fastfail mechanism. In Windows 8
|
||||
// and later, this will terminate the process immediately without running any
|
||||
// in-process exception handlers. In earlier versions of Windows, this
|
||||
// sequence of instructions will be treated as an access violation,
|
||||
// terminating the process but without necessarily bypassing all exception
|
||||
// handlers.
|
||||
//
|
||||
// https://msdn.microsoft.com/en-us/library/dn774154.aspx
|
||||
#[cfg(all(windows, any(target_arch = "x86", target_arch = "x86_64")))]
|
||||
unsafe fn abort_internal() -> ! {
|
||||
asm!("int $$0x29" :: "{ecx}"(7) ::: volatile); // 7 is FAST_FAIL_FATAL_APP_EXIT
|
||||
::intrinsics::unreachable();
|
||||
}
|
||||
|
||||
// Other platforms should use the appropriate platform-specific mechanism for
|
||||
// aborting the process. If no platform-specific mechanism is available,
|
||||
// ::intrinsics::abort() may be used instead. The above implementations cover
|
||||
@ -66,7 +40,7 @@ unsafe fn abort_internal() -> ! {
|
||||
|
||||
pub fn abort(args: fmt::Arguments) -> ! {
|
||||
dumb_print(format_args!("fatal runtime error: {}\n", args));
|
||||
unsafe { abort_internal(); }
|
||||
unsafe { ::sys::abort_internal(); }
|
||||
}
|
||||
|
||||
#[allow(dead_code)] // stack overflow detection not enabled on all platforms
|
||||
|
@ -163,3 +163,14 @@ pub fn cvt_r<T, F>(mut f: F) -> io::Result<T>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// On Unix-like platforms, libc::abort will unregister signal handlers
|
||||
// including the SIGABRT handler, preventing the abort from being blocked, and
|
||||
// fclose streams, with the side effect of flushing them so libc bufferred
|
||||
// output will be printed. Additionally the shell will generally print a more
|
||||
// understandable error message like "Abort trap" rather than "Illegal
|
||||
// instruction" that intrinsics::abort would cause, as intrinsics::abort is
|
||||
// implemented as an illegal instruction.
|
||||
pub unsafe fn abort_internal() -> ! {
|
||||
::libc::abort()
|
||||
}
|
||||
|
@ -221,3 +221,17 @@ pub fn dur2timeout(dur: Duration) -> c::DWORD {
|
||||
}
|
||||
}).unwrap_or(c::INFINITE)
|
||||
}
|
||||
|
||||
// On Windows, use the processor-specific __fastfail mechanism. In Windows 8
|
||||
// and later, this will terminate the process immediately without running any
|
||||
// in-process exception handlers. In earlier versions of Windows, this
|
||||
// sequence of instructions will be treated as an access violation,
|
||||
// terminating the process but without necessarily bypassing all exception
|
||||
// handlers.
|
||||
//
|
||||
// https://msdn.microsoft.com/en-us/library/dn774154.aspx
|
||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
||||
pub unsafe fn abort_internal() -> ! {
|
||||
asm!("int $$0x29" :: "{ecx}"(7) ::: volatile); // 7 is FAST_FAIL_FATAL_APP_EXIT
|
||||
::intrinsics::unreachable();
|
||||
}
|
||||
|
@ -70,7 +70,6 @@ const EXCEPTION_PATHS: &'static [&'static str] = &[
|
||||
"src/libstd/num/f64.rs",
|
||||
"src/libstd/sys/common/mod.rs",
|
||||
"src/libstd/sys/common/net.rs",
|
||||
"src/libstd/sys/common/util.rs",
|
||||
"src/libterm", // Not sure how to make this crate portable, but test needs it
|
||||
"src/libtest", // Probably should defer to unstable std::sys APIs
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user