about summary refs log tree commit diff
path: root/library/std/src/sys
diff options
context:
space:
mode:
authorDan Gohman <dev@sunfishcode.online>2021-07-19 07:06:42 -0700
committerDan Gohman <dev@sunfishcode.online>2021-07-19 07:16:37 -0700
commit2a56a681c4cfd56822e447a66adccdc32580b46a (patch)
tree7d526b156ded8f1d9c9aa56325d1485417d0e079 /library/std/src/sys
parent8df945c4717ffaf923b57bf30c473df6fc98bc85 (diff)
downloadrust-2a56a681c4cfd56822e447a66adccdc32580b46a.tar.gz
rust-2a56a681c4cfd56822e447a66adccdc32580b46a.zip
Add comments explaining the unix command-line argument support.
Following up on #87236, add comments to the unix command-line argument
support explaining that the code doesn't mutate the system-provided
argc/argv, and that this is why the code doesn't need a lock or special
memory ordering.
Diffstat (limited to 'library/std/src/sys')
-rw-r--r--library/std/src/sys/unix/args.rs18
1 files changed, 16 insertions, 2 deletions
diff --git a/library/std/src/sys/unix/args.rs b/library/std/src/sys/unix/args.rs
index ad93fa610c4..0bd1ea64577 100644
--- a/library/std/src/sys/unix/args.rs
+++ b/library/std/src/sys/unix/args.rs
@@ -77,10 +77,18 @@ mod imp {
     use crate::ptr;
     use crate::sync::atomic::{AtomicIsize, AtomicPtr, Ordering};
 
+    // The system-provided argc and argv, which we store in static memory
+    // here so that we can defer the work of parsing them until its actually
+    // needed.
+    //
+    // Note that we never mutate argv/argc, the argv array, or the argv
+    // strings, which allows the code in this file to be very simple.
     static ARGC: AtomicIsize = AtomicIsize::new(0);
     static ARGV: AtomicPtr<*const u8> = AtomicPtr::new(ptr::null_mut());
 
     unsafe fn really_init(argc: isize, argv: *const *const u8) {
+        // These don't need to be ordered with each other or other stores,
+        // because they only hold the unmodified system-provide argv/argc.
         ARGC.store(argc, Ordering::Relaxed);
         ARGV.store(argv as *mut _, Ordering::Relaxed);
     }
@@ -122,8 +130,14 @@ mod imp {
 
     fn clone() -> Vec<OsString> {
         unsafe {
-            // Load ARGC and ARGV without a lock. If the store to either ARGV or
-            // ARGC isn't visible yet, we'll return an empty argument list.
+            // Load ARGC and ARGV, which hold the unmodified system-provided
+            // argc/argv, so we can read the pointed-to memory without atomics
+            // or synchronization.
+            //
+            // If either ARGC or ARGV is still zero or null, then either there
+            // really are no arguments, or someone is asking for `args()`
+            // before initialization has completed, and we return an empty
+            // list.
             let argv = ARGV.load(Ordering::Relaxed);
             let argc = if argv.is_null() { 0 } else { ARGC.load(Ordering::Relaxed) };
             (0..argc)