From 1b7c99655f300aa0b8ba216cd2029dc588c3ef88 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 21 Jun 2013 01:28:23 -0700 Subject: std::rt: Support os::args --- src/libstd/os.rs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/libstd/os.rs') diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 59b40b93d4d..765dd30febc 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -40,6 +40,8 @@ use option::{Some, None}; use os; use prelude::*; use ptr; +use rt; +use rt::TaskContext; use str; use uint; use unstable::finally::Finally; @@ -1167,10 +1169,17 @@ pub fn real_args() -> ~[~str] { #[cfg(target_os = "android")] #[cfg(target_os = "freebsd")] pub fn real_args() -> ~[~str] { - unsafe { - let argc = rustrt::rust_get_argc(); - let argv = rustrt::rust_get_argv(); - load_argc_and_argv(argc, argv) + if rt::context() == TaskContext { + match rt::args::clone() { + Some(args) => args, + None => fail!("process arguments not initialized") + } + } else { + unsafe { + let argc = rustrt::rust_get_argc(); + let argv = rustrt::rust_get_argv(); + load_argc_and_argv(argc, argv) + } } } -- cgit 1.4.1-3-g733a5 From 07e52eb7fc75466d294a1fd9d614f5e0276ab834 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 9 Jul 2013 13:29:05 -0700 Subject: std: Make os::set_exit_status work with newsched --- src/libstd/os.rs | 11 +++++++++-- src/libstd/rt/mod.rs | 10 +++++++++- src/libstd/rt/util.rs | 22 ++++++++++++++++++++++ src/rt/rust_builtin.cpp | 15 +++++++++++++++ src/rt/rustrt.def.in | 2 ++ 5 files changed, 57 insertions(+), 3 deletions(-) (limited to 'src/libstd/os.rs') diff --git a/src/libstd/os.rs b/src/libstd/os.rs index c26020dd06d..5c78b7c14e5 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -1134,8 +1134,15 @@ pub fn last_os_error() -> ~str { * ignored and the process exits with the default failure status */ pub fn set_exit_status(code: int) { - unsafe { - rustrt::rust_set_exit_status(code as libc::intptr_t); + use rt; + use rt::OldTaskContext; + + if rt::context() == OldTaskContext { + unsafe { + rustrt::rust_set_exit_status(code as libc::intptr_t); + } + } else { + rt::util::set_exit_status(code); } } diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index b70549c266a..51f4737ef85 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -260,7 +260,15 @@ pub fn run(main: ~fn()) -> int { } unsafe { - let exit_code = if exit_success { 0 } else { DEFAULT_ERROR_CODE }; + let exit_code = if exit_success { + use rt::util; + + // If we're exiting successfully, then return the global + // exit status, which can be set programmatically. + util::get_exit_status() + } else { + DEFAULT_ERROR_CODE + }; (*exit_code_clone.get()).store(exit_code, SeqCst); } }; diff --git a/src/libstd/rt/util.rs b/src/libstd/rt/util.rs index 5219ae1d540..a1169954688 100644 --- a/src/libstd/rt/util.rs +++ b/src/libstd/rt/util.rs @@ -97,3 +97,25 @@ memory and partly incapable of presentation to others.", unsafe { libc::abort(); } } + +pub fn set_exit_status(code: int) { + + unsafe { + return rust_set_exit_status_newrt(code as libc::uintptr_t); + } + + extern { + fn rust_set_exit_status_newrt(code: libc::uintptr_t); + } +} + +pub fn get_exit_status() -> int { + + unsafe { + return rust_get_exit_status_newrt() as int; + } + + extern { + fn rust_get_exit_status_newrt() -> libc::uintptr_t; + } +} \ No newline at end of file diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index 8dc773a4d39..caa2b53b3db 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -960,6 +960,21 @@ rust_get_global_args_ptr() { return &global_args_ptr; } +static lock_and_signal exit_status_lock; +static uintptr_t exit_status = 0; + +extern "C" CDECL void +rust_set_exit_status_newrt(uintptr_t code) { + scoped_lock with(exit_status_lock); + exit_status = code; +} + +extern "C" CDECL uintptr_t +rust_get_exit_status_newrt() { + scoped_lock with(exit_status_lock); + return exit_status; +} + // // Local Variables: // mode: C++ diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index cd207a0a058..ea614330866 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -270,3 +270,5 @@ rust_get_global_args_ptr rust_current_boxed_region rust_take_global_args_lock rust_drop_global_args_lock +rust_set_exit_status_newrt +rust_get_exit_status_newrt \ No newline at end of file -- cgit 1.4.1-3-g733a5