Skip to content

Commit 9a5a064

Browse files
committed
improve _tlv_exit test
1 parent de25371 commit 9a5a064

File tree

2 files changed

+28
-19
lines changed

2 files changed

+28
-19
lines changed

tests/pass/tls/macos_tlv_atexit.rs

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,40 @@
11
//@only-target-darwin
22

3-
use std::ptr;
43
use std::thread;
54

65
extern "C" {
76
fn _tlv_atexit(dtor: unsafe extern "C" fn(*mut u8), arg: *mut u8);
87
}
98

10-
fn register(dtor: extern "C" fn(*mut u8)) {
11-
unsafe {
12-
_tlv_atexit(dtor, ptr::null_mut());
9+
fn register<F>(f: F)
10+
where
11+
F: FnOnce() + 'static,
12+
{
13+
unsafe extern "C" fn run<F>(data: *mut u8)
14+
where
15+
F: FnOnce() + 'static,
16+
{
17+
unsafe { (*Box::from_raw(data as *mut F))() }
1318
}
14-
}
15-
16-
extern "C" fn register_another(_: *mut u8) {
17-
println!("registering another dtor");
18-
register(run);
19-
}
2019

21-
extern "C" fn run(_: *mut u8) {
22-
println!("dtor was called");
20+
unsafe {
21+
_tlv_atexit(run::<F>, Box::into_raw(Box::new(f)) as *mut u8);
22+
}
2323
}
2424

2525
fn main() {
2626
thread::spawn(|| {
27-
register(run);
28-
register(run);
27+
register(|| println!("dtor 2"));
28+
register(|| println!("dtor 1"));
29+
println!("exiting thread");
2930
})
3031
.join()
3132
.unwrap();
3233

33-
register(register_another);
34+
println!("exiting main");
35+
register(|| println!("dtor 5"));
36+
register(|| {
37+
println!("registering dtor in dtor 4");
38+
register(|| println!("dtor 3"));
39+
});
3440
}
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
dtor was called
2-
dtor was called
3-
registering another dtor
4-
dtor was called
1+
exiting thread
2+
dtor 1
3+
dtor 2
4+
exiting main
5+
registering dtor in dtor 4
6+
dtor 3
7+
dtor 5

0 commit comments

Comments
 (0)