From b66681cd31674e1a2d0b9675ef8183c463470bb5 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Mon, 24 Nov 2014 16:38:06 -0800 Subject: [PATCH] Allow args to work without rt initialization --- src/libstd/os.rs | 6 +----- src/libstd/rt/args.rs | 22 +++++++++------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 550e9e06aae..f46d9ab7c7e 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -702,11 +702,7 @@ fn real_args_as_bytes() -> Vec> { target_os = "dragonfly"))] fn real_args_as_bytes() -> Vec> { use rt; - - match rt::args::clone() { - Some(args) => args, - None => panic!("process arguments not initialized") - } + rt::args::clone().unwrap_or_else(|| vec![]) } #[cfg(not(windows))] diff --git a/src/libstd/rt/args.rs b/src/libstd/rt/args.rs index 8b9dbf73c53..93c956fc3c5 100644 --- a/src/libstd/rt/args.rs +++ b/src/libstd/rt/args.rs @@ -62,37 +62,33 @@ mod imp { } pub unsafe fn cleanup() { - rtassert!(take().is_some()); + take(); LOCK.destroy(); } pub fn take() -> Option>> { - with_lock(|| unsafe { + let guard = LOCK.lock(); + unsafe { let ptr = get_global_ptr(); let val = mem::replace(&mut *ptr, None); val.as_ref().map(|s: &Box>>| (**s).clone()) - }) + } } pub fn put(args: Vec>) { - with_lock(|| unsafe { + let guard = LOCK.lock(); + unsafe { let ptr = get_global_ptr(); rtassert!((*ptr).is_none()); (*ptr) = Some(box args.clone()); - }) + } } pub fn clone() -> Option>> { - with_lock(|| unsafe { + let guard = LOCK.lock(); + unsafe { let ptr = get_global_ptr(); (*ptr).as_ref().map(|s: &Box>>| (**s).clone()) - }) - } - - fn with_lock(f: F) -> T where F: FnOnce() -> T { - unsafe { - let _guard = LOCK.lock(); - f() } }