1- #![ allow( implicit_provenance_casts) ] // FIXME: this module systematically confuses pointers and integers
2-
31use crate :: ffi:: OsString ;
42use crate :: num:: NonZero ;
53use crate :: ops:: Try ;
6- use crate :: sync:: atomic :: { Atomic , AtomicUsize , Ordering } ;
4+ use crate :: sync:: OnceLock ;
75use crate :: sys:: FromInner ;
86use crate :: sys:: os_str:: Buf ;
97use 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) ) ]
2017pub 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
3131pub 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
3735pub struct Args {
0 commit comments