fn futexForAddress(ev: *Evented, address: usize) *Futex ev: *Eventedaddress: usize1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640fn futexForAddress(ev: *Evented, address: usize) *Futex {
// Here we use Fibonacci hashing: the golden ratio can be used to evenly redistribute input
// values across a range, giving a poor, but extremely quick to compute, hash.
// This literal is the rounded value of '2^64 / phi' (where 'phi' is the golden ratio). The
// shift then converts it to '2^b / phi', where 'b' is the pointer bit width.
const fibonacci_multiplier = 0x9E3779B97F4A7C15 >> (64 - @bitSizeOf(usize));
const hashed = address *% fibonacci_multiplier;
comptime assert(std.math.isPowerOfTwo(ev.futexes.len));
// The high bits of `hashed` have better entropy than the low bits.
return &ev.futexes[hashed >> @clz(ev.futexes.len - 1)];
}