Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/cache/src/main/kotlin/org/openrs2/cache/UnpackedCache.kt

75 lines
1.7 KiB

package org.openrs2.cache
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap
import it.unimi.dsi.fastutil.longs.LongArrayList
internal class UnpackedCache(
private val capacity: Int
) {
private val cache = Long2ObjectLinkedOpenHashMap<Archive.Unpacked>()
init {
require(capacity >= 1)
}
fun get(archive: Int, group: Int): Archive.Unpacked? {
return cache.getAndMoveToLast(key(archive, group))
}
fun put(archive: Int, group: Int, unpacked: Archive.Unpacked) {
while (cache.size >= capacity) {
val lru = cache.removeFirst()
lru.flush()
lru.release()
}
cache.putAndMoveToLast(key(archive, group), unpacked)?.release()
}
fun remove(archive: Int) {
val start = key(archive, 0)
val end = key(archive + 1, 0)
val keys = LongArrayList()
val it = cache.keys.iterator(start)
while (it.hasNext()) {
val key = it.nextLong()
if (key >= end) {
break
}
keys += key
}
for (i in 0 until keys.size) {
cache.remove(keys.getLong(i)).release()
}
}
fun remove(archive: Int, group: Int) {
cache.remove(key(archive, group))?.release()
}
fun flush() {
for (unpacked in cache.values) {
unpacked.flush()
}
}
fun clear() {
for (unpacked in cache.values) {
unpacked.flush()
unpacked.release()
}
cache.clear()
}
private fun key(archive: Int, group: Int): Long {
return (archive.toLong() shl 32) or group.toLong()
}
companion object {
const val DEFAULT_CAPACITY: Int = 1024
}
}