File tree Expand file tree Collapse file tree 2 files changed +9
-6
lines changed Expand file tree Collapse file tree 2 files changed +9
-6
lines changed Original file line number Diff line number Diff line change @@ -10,11 +10,14 @@ fn register<F>(f: F)
1010where
1111 F : FnOnce ( ) + ' static ,
1212{
13- unsafe extern "C" fn run < F > ( data : * mut u8 )
13+ // This will receive the pointer passed into `_tlv_atexit`, which is the
14+ // original `f` but boxed up.
15+ unsafe extern "C" fn run < F > ( ptr : * mut u8 )
1416 where
1517 F : FnOnce ( ) + ' static ,
1618 {
17- unsafe { ( * Box :: from_raw ( data as * mut F ) ) ( ) }
19+ let f = unsafe { Box :: from_raw ( ptr as * mut F ) } ;
20+ f ( )
1821 }
1922
2023 unsafe {
@@ -34,7 +37,7 @@ fn main() {
3437 println ! ( "exiting main" ) ;
3538 register ( || println ! ( "dtor 5" ) ) ;
3639 register ( || {
37- println ! ( "registering dtor in dtor 4 " ) ;
38- register ( || println ! ( "dtor 3 " ) ) ;
40+ println ! ( "registering dtor in dtor 3 " ) ;
41+ register ( || println ! ( "dtor 4 " ) ) ;
3942 } ) ;
4043}
Original file line number Diff line number Diff line change @@ -2,6 +2,6 @@ exiting thread
22dtor 1
33dtor 2
44exiting main
5- registering dtor in dtor 4
6- dtor 3
5+ registering dtor in dtor 3
6+ dtor 4
77dtor 5
You can’t perform that action at this time.
0 commit comments