Skip to content

Commit 7cf798c

Browse files
committed
std: use OnceLock for SGX argument storage
1 parent 8e15021 commit 7cf798c

1 file changed

Lines changed: 8 additions & 11 deletions

File tree

  • library/std/src/sys/args

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
// FIXME: this module systematically confuses pointers and integers
2-
#![allow(fuzzy_provenance_casts, lossy_provenance_casts)]
3-
41
use crate::ffi::OsString;
52
use crate::num::NonZero;
63
use crate::ops::Try;
7-
use crate::sync::atomic::{Atomic, AtomicUsize, Ordering};
4+
use crate::sync::OnceLock;
85
use crate::sys::FromInner;
96
use crate::sys::os_str::Buf;
107
use crate::sys::pal::abi::usercalls::alloc;
@@ -14,8 +11,7 @@ use crate::{fmt, slice};
1411
// Specifying linkage/symbol name is solely to ensure a single instance between this crate and its unit tests
1512
#[cfg_attr(test, linkage = "available_externally")]
1613
#[unsafe(export_name = "_ZN16__rust_internals3std3sys3sgx4args4ARGSE")]
17-
static ARGS: Atomic<usize> = AtomicUsize::new(0);
18-
type ArgsStore = Vec<OsString>;
14+
static ARGS: OnceLock<Vec<OsString>> = OnceLock::new();
1915

2016
#[cfg_attr(test, allow(dead_code))]
2117
pub unsafe fn init(argc: isize, argv: *const *const u8) {
@@ -24,15 +20,16 @@ pub unsafe fn init(argc: isize, argv: *const *const u8) {
2420
let args = args
2521
.iter()
2622
.map(|a| OsString::from_inner(Buf { inner: a.copy_user_buffer() }))
27-
.collect::<ArgsStore>();
28-
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+
}
2928
}
3029
}
3130

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

3835
pub struct Args {

0 commit comments

Comments
 (0)