diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-07-21 15:52:49 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-21 15:52:49 +0200 |
| commit | eb54ddd123d0c2d14968336189eb5ab9ab169c8e (patch) | |
| tree | c3f1cad52b6e499acd8863f7821f5e65a98030a1 /library/std/src | |
| parent | 1008ace95c825bd48ad9dffdb27fd63be45bb3c2 (diff) | |
| parent | 2a56a681c4cfd56822e447a66adccdc32580b46a (diff) | |
| download | rust-eb54ddd123d0c2d14968336189eb5ab9ab169c8e.tar.gz rust-eb54ddd123d0c2d14968336189eb5ab9ab169c8e.zip | |
Rollup merge of #87279 - sunfishcode:document-unix-argv, r=RalfJung
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. r? ```@RalfJung```
Diffstat (limited to 'library/std/src')
| -rw-r--r-- | library/std/src/sys/unix/args.rs | 18 |
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) |
