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)
10
10
where
11
11
F : FnOnce ( ) + ' static ,
12
12
{
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 )
14
16
where
15
17
F : FnOnce ( ) + ' static ,
16
18
{
17
- unsafe { ( * Box :: from_raw ( data as * mut F ) ) ( ) }
19
+ let f = unsafe { Box :: from_raw ( ptr as * mut F ) } ;
20
+ f ( )
18
21
}
19
22
20
23
unsafe {
@@ -34,7 +37,7 @@ fn main() {
34
37
println ! ( "exiting main" ) ;
35
38
register ( || println ! ( "dtor 5" ) ) ;
36
39
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 " ) ) ;
39
42
} ) ;
40
43
}
Original file line number Diff line number Diff line change @@ -2,6 +2,6 @@ exiting thread
2
2
dtor 1
3
3
dtor 2
4
4
exiting main
5
- registering dtor in dtor 4
6
- dtor 3
5
+ registering dtor in dtor 3
6
+ dtor 4
7
7
dtor 5
You can’t perform that action at this time.
0 commit comments