From e693496c17562b3e865b545f755562bcad81f2e8 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 4 Nov 2018 11:40:15 +1100 Subject: [PATCH] SPIGOT-4467: Improve ExpiringMap --- nms-patches/ExpiringMap.patch | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 nms-patches/ExpiringMap.patch diff --git a/nms-patches/ExpiringMap.patch b/nms-patches/ExpiringMap.patch new file mode 100644 index 0000000000..874be6879a --- /dev/null +++ b/nms-patches/ExpiringMap.patch @@ -0,0 +1,61 @@ +--- a/net/minecraft/server/ExpiringMap.java ++++ b/net/minecraft/server/ExpiringMap.java +@@ -4,8 +4,10 @@ + import it.unimi.dsi.fastutil.longs.Long2LongMap; + import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; + import it.unimi.dsi.fastutil.longs.Long2LongMap.Entry; ++import it.unimi.dsi.fastutil.objects.ObjectCollection; + import it.unimi.dsi.fastutil.objects.ObjectIterator; + import java.util.Map; ++import java.util.function.LongFunction; + + public class ExpiringMap extends Long2ObjectOpenHashMap { + +@@ -21,11 +23,17 @@ + long j = SystemUtils.b(); + + this.b.put(i, j); +- ObjectIterator objectiterator = this.b.long2LongEntrySet().iterator(); ++ cleanup(); ++ // CraftBukkit start ++ } ++ ++ public void cleanup() { ++ long j = SystemUtils.b(); ++ ObjectIterator objectiterator = this.b.long2LongEntrySet().iterator(); // CraftBukkit - decompile error + + while (objectiterator.hasNext()) { +- Entry entry = (Entry) objectiterator.next(); +- Object object = super.get(entry.getLongKey()); ++ Long2LongMap.Entry entry = (Long2LongMap.Entry) objectiterator.next(); // CraftBukkit - decompile error ++ T object = super.get(entry.getLongKey()); // CraftBukkit - decompile error + + if (j - entry.getLongValue() <= (long) this.a) { + break; +@@ -36,6 +44,7 @@ + objectiterator.remove(); + } + } ++ // CraftBukkit end + + } + +@@ -69,4 +78,18 @@ + public T remove(Object object) { + throw new RuntimeException("Not implemented"); + } ++ ++ // CraftBukkit start ++ @Override ++ public T computeIfAbsent(long l, LongFunction lf) { ++ this.b.put(l, SystemUtils.b()); ++ return super.computeIfAbsent(l, lf); ++ } ++ ++ @Override ++ public ObjectCollection values() { ++ cleanup(); ++ return super.values(); ++ } ++ // CraftBukkit end + }