@@ -220,7 +220,12 @@ mod utils {
220
220
/// instances of [`TokenCell<V>`] conceptually owned by the instance of [`Token<V>`] (a
221
221
/// particular thread), unless previous borrow is released. After the release, the used
222
222
/// singleton token should be free to be reused for reborrows.
223
- pub ( super ) fn borrow_mut < ' t > ( & self , _token : & ' t mut Token < V > ) -> & ' t mut V {
223
+ ///
224
+ /// Note that the returned reference's lifetime is restricted to 'self, not 'token to avoid
225
+ /// use-after-free undefined behaviors.
226
+ // As it's protected by token, it's okay to suppress this clippy lint
227
+ #[ allow( clippy:: mut_from_ref) ]
228
+ pub ( super ) fn borrow_mut ( & self , _token : & mut Token < V > ) -> & mut V {
224
229
unsafe { & mut * self . 0 . get ( ) }
225
230
}
226
231
}
@@ -332,10 +337,7 @@ impl TaskInner {
332
337
& self . lock_attempts
333
338
}
334
339
335
- fn blocked_usage_count_mut < ' t > (
336
- & self ,
337
- token : & ' t mut BlockedUsageCountToken ,
338
- ) -> & ' t mut ShortCounter {
340
+ fn blocked_usage_count_mut ( & self , token : & mut BlockedUsageCountToken ) -> & mut ShortCounter {
339
341
self . blocked_usage_count . borrow_mut ( token)
340
342
}
341
343
@@ -369,10 +371,7 @@ impl LockAttempt {
369
371
}
370
372
}
371
373
372
- fn usage_queue_mut < ' t > (
373
- & self ,
374
- usage_queue_token : & ' t mut UsageQueueToken ,
375
- ) -> & ' t mut UsageQueueInner {
374
+ fn usage_queue_mut ( & self , usage_queue_token : & mut UsageQueueToken ) -> & mut UsageQueueInner {
376
375
self . usage_queue . 0 . borrow_mut ( usage_queue_token)
377
376
}
378
377
}
@@ -1251,11 +1250,12 @@ mod tests {
1251
1250
SchedulingStateMachine :: exclusively_initialize_current_thread_for_scheduling ( )
1252
1251
} ;
1253
1252
let usage_queue = UsageQueue :: default ( ) ;
1253
+ let usage_queue_for_lock_attempt = UsageQueue :: default ( ) ;
1254
1254
let _ = SchedulingStateMachine :: unlock_usage_queue (
1255
1255
usage_queue
1256
1256
. 0
1257
1257
. borrow_mut ( & mut state_machine. usage_queue_token ) ,
1258
- & LockAttempt :: new ( usage_queue , RequestedUsage :: Writable ) ,
1258
+ & LockAttempt :: new ( usage_queue_for_lock_attempt , RequestedUsage :: Writable ) ,
1259
1259
) ;
1260
1260
}
1261
1261
@@ -1270,11 +1270,12 @@ mod tests {
1270
1270
. 0
1271
1271
. borrow_mut ( & mut state_machine. usage_queue_token )
1272
1272
. current_usage = Usage :: Writable ;
1273
+ let usage_queue_for_lock_attempt = UsageQueue :: default ( ) ;
1273
1274
let _ = SchedulingStateMachine :: unlock_usage_queue (
1274
1275
usage_queue
1275
1276
. 0
1276
1277
. borrow_mut ( & mut state_machine. usage_queue_token ) ,
1277
- & LockAttempt :: new ( usage_queue , RequestedUsage :: Readonly ) ,
1278
+ & LockAttempt :: new ( usage_queue_for_lock_attempt , RequestedUsage :: Readonly ) ,
1278
1279
) ;
1279
1280
}
1280
1281
@@ -1289,11 +1290,12 @@ mod tests {
1289
1290
. 0
1290
1291
. borrow_mut ( & mut state_machine. usage_queue_token )
1291
1292
. current_usage = Usage :: Readonly ( ShortCounter :: one ( ) ) ;
1293
+ let usage_queue_for_lock_attempt = UsageQueue :: default ( ) ;
1292
1294
let _ = SchedulingStateMachine :: unlock_usage_queue (
1293
1295
usage_queue
1294
1296
. 0
1295
1297
. borrow_mut ( & mut state_machine. usage_queue_token ) ,
1296
- & LockAttempt :: new ( usage_queue , RequestedUsage :: Writable ) ,
1298
+ & LockAttempt :: new ( usage_queue_for_lock_attempt , RequestedUsage :: Writable ) ,
1297
1299
) ;
1298
1300
}
1299
1301
}
0 commit comments