Compare commits

..

1 Commits

Author SHA1 Message Date
Andrea Ciliberti 02908cc8b6 WIP Implement TLS Destructors 2 years ago
  1. 9
      Cargo.toml
  2. 4
      src/thread.rs
  3. 18
      src/thread_keys.rs

9
Cargo.toml

@ -1,15 +1,12 @@
[package] [package]
name = "pthread-3ds" name = "pthread-3ds"
authors = ["Rust3DS Org", "Andrea Ciliberti <meziu210@icloud.com>"] authors = [ "Rust3DS Org", "Andrea Ciliberti <meziu210@icloud.com>" ]
version = "0.1.0" version = "0.1.0"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
libc = "0.2.116" libc = "0.2.116"
ctru-sys = { git = "https://git.xenua.me/rust3ds/ctru-rs.git" } ctru-sys = { git = "https://github.com/rust3ds/ctru-rs.git" }
spin = { version = "0.9", default-features = false, features = [ spin = { version = "0.9", default-features = false, features = ["rwlock", "std"] }
"rwlock",
"std",
] }
static_assertions = "1.0" static_assertions = "1.0"

4
src/thread.rs

@ -6,6 +6,8 @@ use std::collections::BTreeMap;
use std::ptr; use std::ptr;
use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::atomic::{AtomicUsize, Ordering};
use crate::thread_keys;
pub mod attr; pub mod attr;
/// The main thread's pthread ID /// The main thread's pthread ID
@ -87,6 +89,8 @@ pub unsafe extern "C" fn pthread_create(
pthread.is_finished = true; pthread.is_finished = true;
pthread.result.0 = result; pthread.result.0 = result;
thread_keys::run_local_destructors();
if pthread.is_detached { if pthread.is_detached {
// libctru will call threadFree once this thread dies // libctru will call threadFree once this thread dies
thread_map.remove(&thread_id); thread_map.remove(&thread_id);

18
src/thread_keys.rs

@ -19,6 +19,24 @@ fn is_valid_key(key: Key) -> bool {
KEYS.read().contains_key(&(key as Key)) KEYS.read().contains_key(&(key as Key))
} }
pub(crate) fn run_local_destructors() {
unsafe {
// We iterate all the thread-local keys set.
//
// When using `std` and the `thread_local!` macro there should be only one key registered here,
// which is the list of keys to destroy.
for (key, value) in LOCALS.iter() {
// We retrieve the destructor for a key from the static list.
if let Some(destructor) = KEYS.read().get(&key) {
// If the destructor is registered for a key, run it.
if let Some(d) = destructor {
d(*value);
}
}
}
};
}
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn pthread_key_create( pub unsafe extern "C" fn pthread_key_create(
key: *mut libc::pthread_key_t, key: *mut libc::pthread_key_t,

Loading…
Cancel
Save