1
1
use crate :: loom:: alloc:: Track ;
2
- use crate :: loom:: cell:: CausalCheck ;
3
2
use crate :: task:: core:: { Cell , Core , Header , Trailer } ;
4
3
use crate :: task:: state:: Snapshot ;
5
4
use crate :: task:: { JoinError , Schedule , Task } ;
@@ -151,8 +150,12 @@ where
151
150
pub ( super ) unsafe fn drop_task ( mut self ) {
152
151
let might_drop_join_waker_on_release = self . might_drop_join_waker_on_release ( ) ;
153
152
154
- // Read the join waker cell just to have it
155
- let ( join_waker, check) = self . read_join_waker ( ) ;
153
+ let join_waker = if might_drop_join_waker_on_release {
154
+ // Read the join waker cell just to have it
155
+ self . read_join_waker ( )
156
+ } else {
157
+ MaybeUninit :: uninit ( )
158
+ } ;
156
159
157
160
// transition the task to released
158
161
let res = self . header ( ) . state . release_task ( ) ;
@@ -163,7 +166,6 @@ where
163
166
debug_assert ! ( res. has_join_waker( ) ) ;
164
167
165
168
// Its our responsibility to drop the waker
166
- check. check ( ) ;
167
169
let _ = join_waker. assume_init ( ) ;
168
170
}
169
171
@@ -201,14 +203,13 @@ where
201
203
// possible that, after the transition, we are responsible for dropping
202
204
// the waker but before the waker can be read from the struct, the
203
205
// struct is deallocated.
204
- let ( waker, check ) = self . read_join_waker ( ) ;
206
+ let waker = self . read_join_waker ( ) ;
205
207
206
208
// The operation counts as dropping the join handle
207
209
let res = self . header ( ) . state . complete_join_handle ( ) ;
208
210
209
211
if res. is_released ( ) {
210
212
// We are responsible for freeing the waker handle
211
- check. check ( ) ;
212
213
drop ( waker. assume_init ( ) ) ;
213
214
}
214
215
@@ -264,7 +265,7 @@ where
264
265
// possible that, after the transition, we are responsible for dropping
265
266
// the waker but before the waker can be read from the struct, the
266
267
// struct is deallocated.
267
- let ( waker, check ) = self . read_join_waker ( ) ;
268
+ let waker = self . read_join_waker ( ) ;
268
269
269
270
// The operation counts as dropping the join handle
270
271
let res = match self . header ( ) . state . drop_join_handle_slow ( ) {
@@ -283,7 +284,6 @@ where
283
284
284
285
if !( res. is_complete ( ) | res. is_canceled ( ) ) || res. is_released ( ) {
285
286
// We are responsible for freeing the waker handle
286
- check. check ( ) ;
287
287
drop ( waker. assume_init ( ) ) ;
288
288
}
289
289
@@ -466,19 +466,22 @@ where
466
466
if join_interest {
467
467
let res1 = self . transition_to_complete ( join_interest) ;
468
468
469
- // At this point, the join waker may not be changed. Once we perform
470
- // `release_task` we may no longer read from the struct but we
471
- // **may** be responsible for dropping the waker. We do an
472
- // optimistic read here.
473
- let ( join_waker, check) = unsafe { self . read_join_waker ( ) } ;
469
+ let join_waker = if res1. has_join_waker ( ) {
470
+ // At this point, the join waker may not be changed. Once we perform
471
+ // `release_task` we may no longer read from the struct but we
472
+ // **may** be responsible for dropping the waker. We do an
473
+ // optimistic read here.
474
+ unsafe { self . read_join_waker ( ) }
475
+ } else {
476
+ MaybeUninit :: uninit ( )
477
+ } ;
474
478
475
479
let res2 = self . header ( ) . state . release_task ( ) ;
476
480
477
481
if res1. has_join_waker ( ) && !res2. is_join_interested ( ) {
478
482
debug_assert ! ( res2. has_join_waker( ) ) ;
479
483
480
484
// Its our responsibility to drop the waker
481
- check. check ( ) ;
482
485
unsafe {
483
486
drop ( join_waker. assume_init ( ) ) ;
484
487
}
@@ -544,8 +547,8 @@ where
544
547
} ) ;
545
548
}
546
549
547
- unsafe fn read_join_waker ( & mut self ) -> ( MaybeUninit < Option < Waker > > , CausalCheck ) {
548
- self . trailer ( ) . waker . with_deferred ( |ptr| ptr. read ( ) )
550
+ unsafe fn read_join_waker ( & mut self ) -> MaybeUninit < Option < Waker > > {
551
+ self . trailer ( ) . waker . with ( |ptr| ptr. read ( ) )
549
552
}
550
553
551
554
unsafe fn to_task ( & self ) -> Task < S > {
0 commit comments