From 42522ffc2788c644582e681c5632f829da39cd59 Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Sun, 31 Oct 2021 19:54:12 -0700 Subject: [PATCH] Weak hash map in world attached - More robust solution that listening to WorldEvent.Unload --- .../jozufozu/flywheel/event/ForgeEvents.java | 9 ------- .../jozufozu/flywheel/util/WorldAttached.java | 26 ++----------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java index 4a3a73063..5d68edb33 100644 --- a/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java +++ b/src/main/java/com/jozufozu/flywheel/event/ForgeEvents.java @@ -46,13 +46,4 @@ public class ForgeEvents { } } - @SubscribeEvent - public static void onUnloadWorld(WorldEvent.Unload event) { - IWorld world = event.getWorld(); - - if (Backend.isFlywheelWorld(world)) { - WorldAttached.invalidateWorld(world); - } - } - } diff --git a/src/main/java/com/jozufozu/flywheel/util/WorldAttached.java b/src/main/java/com/jozufozu/flywheel/util/WorldAttached.java index 21a864314..bf9080377 100644 --- a/src/main/java/com/jozufozu/flywheel/util/WorldAttached.java +++ b/src/main/java/com/jozufozu/flywheel/util/WorldAttached.java @@ -1,11 +1,7 @@ package com.jozufozu.flywheel.util; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; @@ -16,30 +12,12 @@ import net.minecraft.world.IWorld; public class WorldAttached { - // weak references to prevent leaking hashmaps when a WorldAttached is GC'd during runtime - static List>> allMaps = new ArrayList<>(); private final Map attached; private final Function factory; public WorldAttached(Function factory) { this.factory = factory; - attached = new HashMap<>(); - allMaps.add(new WeakReference<>(attached)); - } - - public static void invalidateWorld(IWorld world) { - Iterator>> i = allMaps.iterator(); - while (i.hasNext()) { - Map map = i.next() - .get(); - if (map == null) { - // If the map has been GC'd, remove the weak reference - i.remove(); - } else { - // Prevent leaks - map.remove(world); - } - } + attached = new WeakHashMap<>(); } @Nonnull