1- // FIXME: this module systematically confuses pointers and integers
2- #![ allow( fuzzy_provenance_casts, lossy_provenance_casts) ]
3-
41use crate :: ffi:: OsString ;
52use crate :: num:: NonZero ;
63use crate :: ops:: Try ;
7- use crate :: sync:: atomic :: { Atomic , AtomicUsize , Ordering } ;
4+ use crate :: sync:: OnceLock ;
85use crate :: sys:: FromInner ;
96use crate :: sys:: os_str:: Buf ;
107use 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) ) ]
2117pub 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
3231pub 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
3835pub struct Args {
0 commit comments