| #![allow(unsafe_op_in_unsafe_fn)] | |
| pub use moto_rt::futex; | |
| use crate::io; | |
| pub(crate) fn map_motor_error(err: moto_rt::Error) -> io::Error { | |
| let error_code: moto_rt::ErrorCode = err.into(); | |
| io::Error::from_raw_os_error(error_code.into()) | |
| } | |
| #[cfg(not(test))] | |
| #[unsafe(no_mangle)] | |
| pub extern "C" fn motor_start() -> ! { | |
| // Initialize the runtime. | |
| moto_rt::start(); | |
| // Call main. | |
| unsafe extern "C" { | |
| fn main(_: isize, _: *const *const u8, _: u8) -> i32; | |
| } | |
| let result = unsafe { main(0, core::ptr::null(), 0) }; | |
| // Terminate the process. | |
| moto_rt::process::exit(result) | |
| } | |
| // SAFETY: must be called only once during runtime initialization. | |
| // NOTE: Motor OS uses moto_rt::start() to initialize runtime (see above). | |
| pub unsafe fn init(_argc: isize, _argv: *const *const u8, _sigpipe: u8) {} | |
| // SAFETY: must be called only once during runtime cleanup. | |
| // NOTE: this is not guaranteed to run, for example when the program aborts. | |
| pub unsafe fn cleanup() {} | |
| pub fn unsupported<T>() -> io::Result<T> { | |
| Err(unsupported_err()) | |
| } | |
| pub fn unsupported_err() -> io::Error { | |
| io::Error::UNSUPPORTED_PLATFORM | |
| } | |
| pub fn abort_internal() -> ! { | |
| moto_rt::process::exit(-1) | |
| } |