/* Module: sys Misc low level stuff */ tag type_desc = { first_param: **ctypes::c_int, size: ctypes::size_t, align: ctypes::size_t // Remaining fields not listed }; #[abi = "cdecl"] native mod rustrt { // Explicitly re-export native stuff we want to be made // available outside this crate. Otherwise it's // visible-in-crate, but not re-exported. fn last_os_error() -> str; fn refcount(t: @T) -> ctypes::intptr_t; fn do_gc(); fn unsupervise(); fn shape_log_str(t: *sys::type_desc, data: T) -> str; fn rust_set_exit_status(code: ctypes::intptr_t); fn set_min_stack(size: ctypes::uintptr_t); } #[abi = "rust-intrinsic"] native mod rusti { fn get_type_desc() -> *type_desc; } /* Function: get_type_desc Returns a pointer to a type descriptor. Useful for calling certain function in the Rust runtime or otherwise performing dark magick. */ fn get_type_desc() -> *type_desc { ret rusti::get_type_desc::(); } /* Function: last_os_error Get a string representing the platform-dependent last error */ fn last_os_error() -> str { rustrt::last_os_error() } /* Function: size_of Returns the size of a type */ fn size_of() -> uint unsafe { ret (*get_type_desc::()).size; } /* Function: align_of Returns the alignment of a type */ fn align_of() -> uint unsafe { ret (*get_type_desc::()).align; } /* Function: refcount Returns the refcount of a shared box */ fn refcount(t: @T) -> uint { ret rustrt::refcount::(t); } /* Function: do_gc Force a garbage collection */ fn do_gc() -> () { ret rustrt::do_gc(); } // FIXME: There's a wrapper for this in the task module and this really // just belongs there fn unsupervise() -> () { ret rustrt::unsupervise(); } fn log_str(t: T) -> str { rustrt::shape_log_str(get_type_desc::(), t) } #[doc( brief = "Sets the process exit code", desc = "Sets the exit code returned by the process if all supervised \ tasks terminate successfully (without failing). If the current \ root task fails and is supervised by the scheduler then any \ user-specified exit status is ignored and the process exits \ with the default failure status." )] fn set_exit_status(code: int) { rustrt::rust_set_exit_status(code as ctypes::intptr_t); } // FIXME: #1495 - This shouldn't exist #[doc( brief = "Globally set the minimum size, in bytes, of a stack segment", desc = "Rust tasks have segmented stacks that are connected in a linked list \ allowing them to start very small and grow very large. In some \ situations this can result in poor performance. Calling this function \ will set the minimum size of all stack segments allocated in the \ future, for all tasks." )] #[deprecated] fn set_min_stack(size: uint) { rustrt::set_min_stack(size); } #[cfg(test)] mod tests { #[test] fn last_os_error() { log(debug, last_os_error()); } #[test] fn size_of_basic() { assert size_of::() == 1u; assert size_of::() == 2u; assert size_of::() == 4u; assert size_of::() == 8u; } #[test] #[cfg(target_arch = "x86")] #[cfg(target_arch = "arm")] fn size_of_32() { assert size_of::() == 4u; assert size_of::<*uint>() == 4u; } #[test] #[cfg(target_arch = "x86_64")] fn size_of_64() { assert size_of::() == 8u; assert size_of::<*uint>() == 8u; } #[test] fn align_of_basic() { assert align_of::() == 1u; assert align_of::() == 2u; assert align_of::() == 4u; } #[test] #[cfg(target_arch = "x86")] #[cfg(target_arch = "arm")] fn align_of_32() { assert align_of::() == 4u; assert align_of::<*uint>() == 4u; } #[test] #[cfg(target_arch = "x86_64")] fn align_of_64() { assert align_of::() == 8u; assert align_of::<*uint>() == 8u; } } // Local Variables: // mode: rust; // fill-column: 78; // indent-tabs-mode: nil // c-basic-offset: 4 // buffer-file-coding-system: utf-8-unix // End: