in kotlinx-coroutines-core/jvm/src/debug/internal/ConcurrentWeakMap.kt [158:188]
fun rehash(): Core {
// use size to approximate new required capacity to have at least 25-50% fill factor,
// may fail due to concurrent modification, will retry
retry@while (true) {
val newCapacity = size.coerceAtLeast(MIN_CAPACITY / 4).takeHighestOneBit() * 4
val newCore = Core(newCapacity)
for (index in 0 until allocated) {
// load the key
val w = keys[index].value
val k = w?.get()
if (w != null && k == null) removeCleanedAt(index) // weak ref was here, but collected
// mark value so that it cannot be changed while we rehash to new core
var value: Any?
while (true) {
value = values[index].value
if (value is Marked) { // already marked -- good
value = value.ref
break
}
// try mark
if (values[index].compareAndSet(value, value.mark())) break
}
if (k != null && value != null) {
val oldValue = newCore.putImpl(k, value as V, w)
if (oldValue === REHASH) continue@retry // retry if we underestimated capacity
assert(oldValue == null)
}
}
return newCore // rehashed everything successfully
}
}