File tree Expand file tree Collapse file tree 2 files changed +28
-19
lines changed Expand file tree Collapse file tree 2 files changed +28
-19
lines changed Original file line number Diff line number Diff line change 11//@only-target-darwin
22
3- use std:: ptr;
43use std:: thread;
54
65extern "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
2525fn 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}
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments