@@ -22,6 +22,11 @@ bitflags! {
22
22
}
23
23
}
24
24
25
+ fn addr ( addr : & AtomicU32 ) -> usize {
26
+ let ptr: * const _ = addr;
27
+ ptr. addr ( )
28
+ }
29
+
25
30
/// If the value at address matches the expected value, park the current thread until it is either
26
31
/// woken up with `futex_wake` (returns 0) or the specified timeout elapses (returns -ETIMEDOUT).
27
32
///
@@ -44,10 +49,7 @@ pub fn futex_wait(address: &AtomicU32, expected: u32, timeout: Option<u64>, flag
44
49
let scheduler = core_scheduler ( ) ;
45
50
scheduler. block_current_task ( wakeup_time) ;
46
51
let handle = scheduler. get_current_task_handle ( ) ;
47
- parking_lot
48
- . entry ( address. as_mut_ptr ( ) . addr ( ) )
49
- . or_default ( )
50
- . push ( handle) ;
52
+ parking_lot. entry ( addr ( address) ) . or_default ( ) . push ( handle) ;
51
53
drop ( parking_lot) ;
52
54
53
55
loop {
@@ -57,7 +59,7 @@ pub fn futex_wait(address: &AtomicU32, expected: u32, timeout: Option<u64>, flag
57
59
if wakeup_time. is_some_and ( |t| t <= get_timer_ticks ( ) ) {
58
60
let mut wakeup = true ;
59
61
// Timeout occurred, try to remove ourselves from the waiting queue.
60
- if let Entry :: Occupied ( mut queue) = parking_lot. entry ( address . as_mut_ptr ( ) . addr ( ) ) {
62
+ if let Entry :: Occupied ( mut queue) = parking_lot. entry ( addr ( address ) ) {
61
63
// If we are not in the waking queue, this must have been a wakeup.
62
64
wakeup = !queue. get_mut ( ) . remove ( handle) ;
63
65
if queue. get ( ) . is_empty ( ) {
@@ -73,7 +75,7 @@ pub fn futex_wait(address: &AtomicU32, expected: u32, timeout: Option<u64>, flag
73
75
} else {
74
76
// If we are not in the waking queue, this must have been a wakeup.
75
77
let wakeup = !parking_lot
76
- . get ( & address . as_mut_ptr ( ) . addr ( ) )
78
+ . get ( & addr ( address ) )
77
79
. is_some_and ( |queue| queue. contains ( handle) ) ;
78
80
79
81
if wakeup {
@@ -97,7 +99,7 @@ pub fn futex_wake(address: &AtomicU32, count: i32) -> i32 {
97
99
}
98
100
99
101
let mut parking_lot = PARKING_LOT . lock ( ) ;
100
- let mut queue = match parking_lot. entry ( address . as_mut_ptr ( ) . addr ( ) ) {
102
+ let mut queue = match parking_lot. entry ( addr ( address ) ) {
101
103
Entry :: Occupied ( entry) => entry,
102
104
Entry :: Vacant ( _) => return 0 ,
103
105
} ;
0 commit comments