@@ -38,7 +38,7 @@ impl Thread {
38
38
let join_mutex = Arc :: new ( Mutex :: new ( ) ) ;
39
39
let state = Arc :: new ( AtomicU8 :: new ( PENDING ) ) ;
40
40
41
- let arg = box ( join_mutex. clone ( ) , state. clone ( ) , box p) ;
41
+ let arg = box ( join_mutex. clone ( ) , state. clone ( ) , p) ;
42
42
43
43
let name = name. unwrap_or_else ( || CStr :: from_bytes_with_nul_unchecked ( b"\0 " ) ) ;
44
44
@@ -74,30 +74,29 @@ impl Thread {
74
74
75
75
extern "C" fn thread_start ( arg : * mut libc:: c_void ) -> * mut libc:: c_void {
76
76
unsafe {
77
- let arg = Box :: < ( Arc < Mutex > , Arc < AtomicU8 > , Box < Box < dyn FnOnce ( ) > > ) > :: from_raw (
78
- arg as * mut _ ,
79
- ) ;
80
- let ( join_mutex, state, main) = * arg;
77
+ let previous_state = {
78
+ let ( join_mutex, state, main) =
79
+ * Box :: from_raw ( arg as * mut ( Arc < Mutex > , Arc < AtomicU8 > , Box < dyn FnOnce ( ) > ) ) ;
81
80
82
- join_mutex. lock ( ) ;
81
+ join_mutex. lock ( ) ;
83
82
84
- state. store ( RUNNING , SeqCst ) ;
83
+ state. store ( RUNNING , SeqCst ) ;
85
84
86
- main ( ) ;
87
- thread_local:: cleanup ( ) ;
85
+ main ( ) ;
86
+ thread_local:: cleanup ( ) ;
88
87
89
- let previous_state = state. swap ( EXITED , SeqCst ) ;
88
+ let previous_state = state. swap ( EXITED , SeqCst ) ;
90
89
91
- join_mutex. unlock ( ) ;
90
+ join_mutex. unlock ( ) ;
92
91
93
- // We drop these here manually since we don't know
94
- // if `vTaskDelete` will ensure they are dropped.
95
- drop ( state) ;
96
- drop ( join_mutex) ;
92
+ previous_state
93
+ } ;
97
94
98
95
if previous_state == DETACHED {
96
+ drop ( previous_state) ;
99
97
vTaskDelete ( ptr:: null_mut ( ) ) ;
100
98
} else {
99
+ drop ( previous_state) ;
101
100
vTaskSuspend ( ptr:: null_mut ( ) ) ;
102
101
}
103
102
}
0 commit comments