Skip to content

Commit b28285d

Browse files
committed
MappingManager self-cleanup
1 parent e0462f1 commit b28285d

File tree

2 files changed

+66
-26
lines changed

2 files changed

+66
-26
lines changed

src/main/java/com/falsepattern/lib/internal/asm/CoreLoadingPlugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ public class CoreLoadingPlugin implements IFMLLoadingPlugin {
6262
long end = System.nanoTime();
6363
Share.LOG.info("Scanned in " + (end - start) / 1000000 + "ms");
6464
//Initializing the rest
65-
Share.LOG.info("Initializing mapping manager...");
6665
MappingManager.initialize();
6766
}
6867

src/main/java/com/falsepattern/lib/mapping/MappingManager.java

Lines changed: 66 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
package com.falsepattern.lib.mapping;
2222

2323
import com.falsepattern.lib.StableAPI;
24+
import com.falsepattern.lib.internal.FalsePatternLib;
25+
import com.falsepattern.lib.internal.Share;
2426
import com.falsepattern.lib.internal.asm.CoreLoadingPlugin;
2527
import com.falsepattern.lib.mapping.storage.Lookup;
2628
import com.falsepattern.lib.mapping.types.MappingType;
@@ -37,44 +39,83 @@
3739

3840
import java.util.HashMap;
3941
import java.util.Map;
42+
import java.util.concurrent.atomic.AtomicLong;
4043

4144
@StableAPI(since = "0.10.0")
4245
public class MappingManager {
43-
private static final Lookup<UniversalClass> internalLookup = new Lookup<>();
44-
private static final Lookup<UniversalClass> regularLookup = new Lookup<>();
45-
private static final Map<String, String> stringPool = new HashMap<>();
46+
private static Lookup<UniversalClass> internalLookup;
47+
private static Lookup<UniversalClass> regularLookup;
4648
private static boolean initialized = false;
4749
private static final Object MUTEX = new Object();
50+
private static final AtomicLong lastInitializedAt = new AtomicLong();
51+
52+
private static class CleanupThread extends Thread {
53+
public CleanupThread() {
54+
setName("MappingManager Cleanup Watchdog");
55+
setDaemon(true);
56+
}
57+
58+
@Override
59+
public void run() {
60+
while (true) {
61+
try {
62+
Thread.sleep(1000);
63+
} catch (InterruptedException e) {
64+
throw new RuntimeException(e);
65+
}
66+
synchronized (MUTEX) {
67+
long time = System.currentTimeMillis();
68+
long lastInit = lastInitializedAt.get();
69+
if (time - lastInit < 10_000) {
70+
continue;
71+
}
72+
Share.LOG.info("Terminating MappingManager");
73+
internalLookup = null;
74+
regularLookup = null;
75+
initialized = false;
76+
return;
77+
}
78+
}
79+
}
80+
}
4881

4982
@SneakyThrows
5083
public static void initialize() {
5184
synchronized (MUTEX) {
5285
if (initialized) {
86+
lastInitializedAt.set(System.currentTimeMillis());
5387
return;
5488
}
5589
initialized = true;
56-
}
57-
val classMappings =
58-
new String(ResourceUtil.getResourceBytesFromJar("/classes.csv", CoreLoadingPlugin.class)).split("\n");
59-
for (int i = 1; i < classMappings.length; i++) {
60-
val line = classMappings[i].split(",");
61-
val clazz = new UniversalClass(line, stringPool);
62-
internalLookup.unwrap(clazz.internalName, clazz);
63-
regularLookup.unwrap(clazz.regularName, clazz);
64-
}
65-
var fieldMappings =
66-
new String(ResourceUtil.getResourceBytesFromJar("/fields.csv", CoreLoadingPlugin.class)).split("\n");
67-
for (int i = 1; i < fieldMappings.length; i++) {
68-
val line = fieldMappings[i].split(",");
69-
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
70-
UniversalField.createAndAddToParent(clazz, line, stringPool);
71-
}
72-
val methodMappings =
73-
new String(ResourceUtil.getResourceBytesFromJar("/methods.csv", CoreLoadingPlugin.class)).split("\n");
74-
for (int i = 1; i < methodMappings.length; i++) {
75-
val line = methodMappings[i].split(",");
76-
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
77-
UniversalMethod.createAndAddToParent(clazz, line, stringPool);
90+
val cleanupThread = new CleanupThread();
91+
Share.LOG.info("Initializing MappingManager");
92+
internalLookup = new Lookup<>();
93+
regularLookup = new Lookup<>();
94+
val stringPool = new HashMap<String, String>();
95+
val classMappings =
96+
new String(ResourceUtil.getResourceBytesFromJar("/classes.csv", CoreLoadingPlugin.class)).split("\n");
97+
for (int i = 1; i < classMappings.length; i++) {
98+
val line = classMappings[i].split(",");
99+
val clazz = new UniversalClass(line, stringPool);
100+
internalLookup.unwrap(clazz.internalName, clazz);
101+
regularLookup.unwrap(clazz.regularName, clazz);
102+
}
103+
var fieldMappings =
104+
new String(ResourceUtil.getResourceBytesFromJar("/fields.csv", CoreLoadingPlugin.class)).split("\n");
105+
for (int i = 1; i < fieldMappings.length; i++) {
106+
val line = fieldMappings[i].split(",");
107+
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
108+
UniversalField.createAndAddToParent(clazz, line, stringPool);
109+
}
110+
val methodMappings =
111+
new String(ResourceUtil.getResourceBytesFromJar("/methods.csv", CoreLoadingPlugin.class)).split("\n");
112+
for (int i = 1; i < methodMappings.length; i++) {
113+
val line = methodMappings[i].split(",");
114+
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
115+
UniversalMethod.createAndAddToParent(clazz, line, stringPool);
116+
}
117+
lastInitializedAt.set(System.currentTimeMillis());
118+
cleanupThread.start();
78119
}
79120
}
80121

0 commit comments

Comments
 (0)