Skip to content

Commit 88a3c51

Browse files
committed
std: use OnceLock for SGX argument storage
1 parent 2574810 commit 88a3c51

1 file changed

Lines changed: 8 additions & 10 deletions

File tree

  • library/std/src/sys/args

library/std/src/sys/args/sgx.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
#![allow(implicit_provenance_casts)] // FIXME: this module systematically confuses pointers and integers
2-
31
use crate::ffi::OsString;
42
use crate::num::NonZero;
53
use crate::ops::Try;
6-
use crate::sync::atomic::{Atomic, AtomicUsize, Ordering};
4+
use crate::sync::OnceLock;
75
use crate::sys::FromInner;
86
use crate::sys::os_str::Buf;
97
use crate::sys::pal::abi::usercalls::alloc;
@@ -13,8 +11,7 @@ use crate::{fmt, slice};
1311
// Specifying linkage/symbol name is solely to ensure a single instance between this crate and its unit tests
1412
#[cfg_attr(test, linkage = "available_externally")]
1513
#[unsafe(export_name = "_ZN16__rust_internals3std3sys3sgx4args4ARGSE")]
16-
static ARGS: Atomic<usize> = AtomicUsize::new(0);
17-
type ArgsStore = Vec<OsString>;
14+
static ARGS: OnceLock<Vec<OsString>> = OnceLock::new();
1815

1916
#[cfg_attr(test, allow(dead_code))]
2017
pub unsafe fn init(argc: isize, argv: *const *const u8) {
@@ -23,15 +20,16 @@ pub unsafe fn init(argc: isize, argv: *const *const u8) {
2320
let args = args
2421
.iter()
2522
.map(|a| OsString::from_inner(Buf { inner: a.copy_user_buffer() }))
26-
.collect::<ArgsStore>();
27-
ARGS.store(Box::into_raw(Box::new(args)) as _, Ordering::Relaxed);
23+
.collect::<Vec<_>>();
24+
25+
if let Err(_) = ARGS.set(args) {
26+
rtabort!("init called twice");
27+
}
2828
}
2929
}
3030

3131
pub fn args() -> Args {
32-
let args = unsafe { (ARGS.load(Ordering::Relaxed) as *const ArgsStore).as_ref() };
33-
let slice = args.map(|args| args.as_slice()).unwrap_or(&[]);
34-
Args { iter: slice.iter() }
32+
Args { iter: ARGS.get().map_or_default(|args| args.iter()) }
3533
}
3634

3735
pub struct Args {

0 commit comments

Comments
 (0)