MappingManager self-cleanup

This commit is contained in:
FalsePattern committed 2024-02-08 08:57:55 +01:00
1 parent e0462f11ea
commit b28285d5cc
2 files changed
+66 -26

No files matched your search

@@ -21,6 +21,8 @@
package com.falsepattern.lib.mapping;
import com.falsepattern.lib.StableAPI;
import com.falsepattern.lib.internal.FalsePatternLib;
import com.falsepattern.lib.internal.Share;
import com.falsepattern.lib.internal.asm.CoreLoadingPlugin;
import com.falsepattern.lib.mapping.storage.Lookup;
import com.falsepattern.lib.mapping.types.MappingType;
@@ -37,44 +39,83 @@ import org.objectweb.asm.tree.MethodInsnNode;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@StableAPI(since = "0.10.0")
public class MappingManager {
private static final Lookup<UniversalClass> internalLookup = new Lookup<>();
private static final Lookup<UniversalClass> regularLookup = new Lookup<>();
private static final Map<String, String> stringPool = new HashMap<>();
private static Lookup<UniversalClass> internalLookup;
private static Lookup<UniversalClass> regularLookup;
private static boolean initialized = false;
private static final Object MUTEX = new Object();
private static final AtomicLong lastInitializedAt = new AtomicLong();
private static class CleanupThread extends Thread {
public CleanupThread() {
setName("MappingManager Cleanup Watchdog");
setDaemon(true);
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
synchronized (MUTEX) {
long time = System.currentTimeMillis();
long lastInit = lastInitializedAt.get();
if (time - lastInit < 10_000) {
continue;
}
Share.LOG.info("Terminating MappingManager");
internalLookup = null;
regularLookup = null;
initialized = false;
return;
}
}
}
}
@SneakyThrows
public static void initialize() {
synchronized (MUTEX) {
if (initialized) {
lastInitializedAt.set(System.currentTimeMillis());
return;
}
initialized = true;
}
val classMappings =
new String(ResourceUtil.getResourceBytesFromJar("/classes.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < classMappings.length; i++) {
val line = classMappings[i].split(",");
val clazz = new UniversalClass(line, stringPool);
internalLookup.unwrap(clazz.internalName, clazz);
regularLookup.unwrap(clazz.regularName, clazz);
}
var fieldMappings =
new String(ResourceUtil.getResourceBytesFromJar("/fields.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < fieldMappings.length; i++) {
val line = fieldMappings[i].split(",");
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
UniversalField.createAndAddToParent(clazz, line, stringPool);
}
val methodMappings =
new String(ResourceUtil.getResourceBytesFromJar("/methods.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < methodMappings.length; i++) {
val line = methodMappings[i].split(",");
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
UniversalMethod.createAndAddToParent(clazz, line, stringPool);
val cleanupThread = new CleanupThread();
Share.LOG.info("Initializing MappingManager");
internalLookup = new Lookup<>();
regularLookup = new Lookup<>();
val stringPool = new HashMap<String, String>();
val classMappings =
new String(ResourceUtil.getResourceBytesFromJar("/classes.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < classMappings.length; i++) {
val line = classMappings[i].split(",");
val clazz = new UniversalClass(line, stringPool);
internalLookup.unwrap(clazz.internalName, clazz);
regularLookup.unwrap(clazz.regularName, clazz);
}
var fieldMappings =
new String(ResourceUtil.getResourceBytesFromJar("/fields.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < fieldMappings.length; i++) {
val line = fieldMappings[i].split(",");
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
UniversalField.createAndAddToParent(clazz, line, stringPool);
}
val methodMappings =
new String(ResourceUtil.getResourceBytesFromJar("/methods.csv", CoreLoadingPlugin.class)).split("\n");
for (int i = 1; i < methodMappings.length; i++) {
val line = methodMappings[i].split(",");
val clazz = internalLookup.get(MappingType.Notch, line[0].substring(0, line[0].lastIndexOf('/')));
UniversalMethod.createAndAddToParent(clazz, line, stringPool);
}
lastInitializedAt.set(System.currentTimeMillis());
cleanupThread.start();
}
}