force trigger uninit_global_object
diff --git a/sgx_tstd/src/rt.rs b/sgx_tstd/src/rt.rs
index 91aced0..e90fa24 100644
--- a/sgx_tstd/src/rt.rs
+++ b/sgx_tstd/src/rt.rs
@@ -17,10 +17,14 @@
//! Runtime services
-use sgx_types::sgx_enclave_id_t;
-use crate::enclave;
use alloc_crate::slice;
use core::str;
+use crate::enclave;
+use crate::sync::SgxSpinlock;
+use crate::thread;
+use sgx_trts::enclave::rsgx_is_supported_EDMM;
+use sgx_types::{sgx_enclave_id_t, sgx_thread_t, SGX_THREAD_T_NULL};
+
// Reexport some of our utilities which are expected by other crates.
pub use crate::panicking::{begin_panic, begin_panic_fmt, update_panic_count};
pub use crate::sys_common::at_exit;
@@ -28,13 +32,33 @@
use crate::sync::Once;
static INIT: Once = Once::new();
+static EXIT: Once = Once::new();
+static GLOBAL_INIT_LOCK: SgxSpinlock = SgxSpinlock::new();
+static mut INIT_TCS: sgx_thread_t = SGX_THREAD_T_NULL;
#[no_mangle]
pub extern "C" fn t_global_exit_ecall() {
+ extern "C" {
+ fn uninit_global_object();
+ }
+
+ GLOBAL_INIT_LOCK.lock();
+ EXIT.call_once(|| {
+ unsafe {
+ if INIT_TCS == thread::rsgx_thread_self() {
+ if !rsgx_is_supported_EDMM() {
+ uninit_global_object();
+ }
+ }
+ }
+ });
}
#[no_mangle]
pub extern "C" fn t_global_init_ecall(id: u64, path: *const u8, len: usize) {
+ GLOBAL_INIT_LOCK.lock();
+ unsafe { INIT_TCS = thread::rsgx_thread_self() };
+
INIT.call_once(|| {
enclave::set_enclave_id(id as sgx_enclave_id_t);
let s = unsafe {
diff --git a/sgx_tstd/src/sync/spinlock.rs b/sgx_tstd/src/sync/spinlock.rs
index 12d97e1..869d6c9 100644
--- a/sgx_tstd/src/sync/spinlock.rs
+++ b/sgx_tstd/src/sync/spinlock.rs
@@ -100,7 +100,7 @@
unsafe impl Sync for SgxSpinlock {}
impl SgxSpinlock {
- pub fn new() -> SgxSpinlock {
+ pub const fn new() -> SgxSpinlock {
SgxSpinlock{inner: SgxThreadSpinlock::new()}
}
diff --git a/sgx_urts/Cargo.toml b/sgx_urts/Cargo.toml
index 3b03a62..c8a20cc 100644
--- a/sgx_urts/Cargo.toml
+++ b/sgx_urts/Cargo.toml
@@ -14,8 +14,8 @@
[features]
default = []
-global_init = []
-global_exit = []
+global_init = ["global_exit"]
+global_exit = ["global_init"]
signal = []