about summary refs log tree commit diff
path: root/src/libstd/sys/unix/args.rs
diff options
context:
space:
mode:
authorMatt Brubeck <mbrubeck@limpet.net>2018-01-03 12:09:22 -0800
committerMatt Brubeck <mbrubeck@limpet.net>2018-01-04 15:11:39 -0800
commit91c3eee1735ad72b579f99cbb6919c3471747d94 (patch)
tree1cb4b6fcd496ce32e21b6b5c3fddd97aadb3513c /src/libstd/sys/unix/args.rs
parentd96cc6e2865ff2cc77f061ae97e58aae50f5a1e9 (diff)
downloadrust-91c3eee1735ad72b579f99cbb6919c3471747d94.tar.gz
rust-91c3eee1735ad72b579f99cbb6919c3471747d94.zip
[unix] Don't clone command-line args on startup
Diffstat (limited to 'src/libstd/sys/unix/args.rs')
-rw-r--r--src/libstd/sys/unix/args.rs39
1 files changed, 16 insertions, 23 deletions
diff --git a/src/libstd/sys/unix/args.rs b/src/libstd/sys/unix/args.rs
index 72169773df5..e1c7ffc19e5 100644
--- a/src/libstd/sys/unix/args.rs
+++ b/src/libstd/sys/unix/args.rs
@@ -69,7 +69,7 @@ impl DoubleEndedIterator for Args {
           target_os = "fuchsia"))]
 mod imp {
     use os::unix::prelude::*;
-    use mem;
+    use ptr;
     use ffi::{CStr, OsString};
     use marker::PhantomData;
     use libc;
@@ -77,49 +77,42 @@ mod imp {
 
     use sys_common::mutex::Mutex;
 
-    static mut GLOBAL_ARGS_PTR: usize = 0;
+    static mut ARGC: isize = 0;
+    static mut ARGV: *const *const u8 = ptr::null();
     static LOCK: Mutex = Mutex::new();
 
     pub unsafe fn init(argc: isize, argv: *const *const u8) {
-        let args = (0..argc).map(|i| {
-            CStr::from_ptr(*argv.offset(i) as *const libc::c_char).to_bytes().to_vec()
-        }).collect();
-
         LOCK.lock();
-        let ptr = get_global_ptr();
-        assert!((*ptr).is_none());
-        (*ptr) = Some(box args);
+        ARGC = argc;
+        ARGV = argv;
         LOCK.unlock();
     }
 
     pub unsafe fn cleanup() {
         LOCK.lock();
-        *get_global_ptr() = None;
+        ARGC = 0;
+        ARGV = ptr::null();
         LOCK.unlock();
     }
 
     pub fn args() -> Args {
-        let bytes = clone().unwrap_or(Vec::new());
-        let v: Vec<OsString> = bytes.into_iter().map(|v| {
-            OsStringExt::from_vec(v)
-        }).collect();
-        Args { iter: v.into_iter(), _dont_send_or_sync_me: PhantomData }
+        Args {
+            iter: clone().into_iter(),
+            _dont_send_or_sync_me: PhantomData
+        }
     }
 
-    fn clone() -> Option<Vec<Vec<u8>>> {
+    fn clone() -> Vec<OsString> {
         unsafe {
             LOCK.lock();
-            let ptr = get_global_ptr();
-            let ret = (*ptr).as_ref().map(|s| (**s).clone());
+            let ret = (0..ARGC).map(|i| {
+                let cstr = CStr::from_ptr(*ARGV.offset(i) as *const libc::c_char);
+                OsStringExt::from_vec(cstr.to_bytes().to_vec())
+            }).collect();
             LOCK.unlock();
             return ret
         }
     }
-
-    fn get_global_ptr() -> *mut Option<Box<Vec<Vec<u8>>>> {
-        unsafe { mem::transmute(&GLOBAL_ARGS_PTR) }
-    }
-
 }
 
 #[cfg(any(target_os = "macos",