Merge 1.19.4 into 1.20
This commit is contained in:
commit
a799afc19c
|
|
@ -12,7 +12,6 @@ import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
|
||||||
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
|
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
|
||||||
import org.embeddedt.modernfix.resources.ReloadExecutor;
|
import org.embeddedt.modernfix.resources.ReloadExecutor;
|
||||||
import org.embeddedt.modernfix.util.ClassInfoManager;
|
import org.embeddedt.modernfix.util.ClassInfoManager;
|
||||||
import org.embeddedt.modernfix.world.IntegratedWatchdog;
|
|
||||||
|
|
||||||
import java.lang.management.ManagementFactory;
|
import java.lang.management.ManagementFactory;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
@ -52,19 +51,6 @@ public class ModernFix {
|
||||||
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.snapshot_easter_egg.NameChange") && !SharedConstants.getCurrentVersion().isStable())
|
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.snapshot_easter_egg.NameChange") && !SharedConstants.getCurrentVersion().isStable())
|
||||||
NAME = "PreemptiveFix";
|
NAME = "PreemptiveFix";
|
||||||
ModernFixPlatformHooks.onServerCommandRegister(ModernFixCommands::register);
|
ModernFixPlatformHooks.onServerCommandRegister(ModernFixCommands::register);
|
||||||
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.spam_thread_dump.ThreadDumper")) {
|
|
||||||
Thread t = new Thread() {
|
|
||||||
public void run() {
|
|
||||||
while(true) {
|
|
||||||
LOGGER.error("------ DEBUG THREAD DUMP (occurs every 60 seconds) ------");
|
|
||||||
LOGGER.error(IntegratedWatchdog.obtainThreadDump());
|
|
||||||
try { Thread.sleep(60000); } catch(InterruptedException e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
t.setDaemon(true);
|
|
||||||
t.start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onServerStarted() {
|
public void onServerStarted() {
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import org.apache.logging.log4j.Logger;
|
||||||
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig;
|
||||||
import org.embeddedt.modernfix.core.config.Option;
|
import org.embeddedt.modernfix.core.config.Option;
|
||||||
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
|
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
|
||||||
|
import org.embeddedt.modernfix.world.ThreadDumper;
|
||||||
import org.objectweb.asm.tree.*;
|
import org.objectweb.asm.tree.*;
|
||||||
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
|
||||||
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
|
||||||
|
|
@ -62,6 +63,20 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin {
|
||||||
|
|
||||||
/* We abuse the constructor of a mixin plugin as a safe location to start modifying the classloader */
|
/* We abuse the constructor of a mixin plugin as a safe location to start modifying the classloader */
|
||||||
ModernFixPlatformHooks.injectPlatformSpecificHacks();
|
ModernFixPlatformHooks.injectPlatformSpecificHacks();
|
||||||
|
|
||||||
|
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.spam_thread_dump.ThreadDumper")) {
|
||||||
|
Thread t = new Thread() {
|
||||||
|
public void run() {
|
||||||
|
while(true) {
|
||||||
|
logger.error("------ DEBUG THREAD DUMP (occurs every 60 seconds) ------");
|
||||||
|
logger.error(ThreadDumper.obtainThreadDump());
|
||||||
|
try { Thread.sleep(60000); } catch(InterruptedException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
t.setDaemon(true);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,6 @@ import net.minecraft.Util;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.lang.management.ManagementFactory;
|
|
||||||
import java.lang.management.ThreadInfo;
|
|
||||||
import java.lang.management.ThreadMXBean;
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
public class IntegratedWatchdog extends Thread {
|
public class IntegratedWatchdog extends Thread {
|
||||||
|
|
@ -25,27 +22,6 @@ public class IntegratedWatchdog extends Thread {
|
||||||
this.setName("ModernFix integrated server watchdog");
|
this.setName("ModernFix integrated server watchdog");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String obtainThreadDump() {
|
|
||||||
ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean();
|
|
||||||
ThreadInfo[] athreadinfo = threadmxbean.dumpAllThreads(true, true);
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
sb.append("Thread Dump:\n");
|
|
||||||
for(ThreadInfo threadinfo : athreadinfo) {
|
|
||||||
sb.append(threadinfo);
|
|
||||||
StackTraceElement[] elements = threadinfo.getStackTrace();
|
|
||||||
if(elements.length > 8) {
|
|
||||||
sb.append("extended trace:\n");
|
|
||||||
for(int i = 8; i < elements.length; i++) {
|
|
||||||
sb.append("\tat ");
|
|
||||||
sb.append(elements[i]);
|
|
||||||
sb.append('\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sb.append('\n');
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
while(true) {
|
while(true) {
|
||||||
MinecraftServer server = this.server.get();
|
MinecraftServer server = this.server.get();
|
||||||
|
|
@ -56,7 +32,7 @@ public class IntegratedWatchdog extends Thread {
|
||||||
long delta = curTime - nextTick;
|
long delta = curTime - nextTick;
|
||||||
if(delta > MAX_TICK_DELTA) {
|
if(delta > MAX_TICK_DELTA) {
|
||||||
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
|
LOGGER.error("A single server tick has taken {}, more than {} milliseconds", delta, MAX_TICK_DELTA);
|
||||||
LOGGER.error(obtainThreadDump());
|
LOGGER.error(ThreadDumper.obtainThreadDump());
|
||||||
nextTick = 0;
|
nextTick = 0;
|
||||||
curTime = 0;
|
curTime = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.embeddedt.modernfix.world;
|
||||||
|
|
||||||
|
import java.lang.management.ManagementFactory;
|
||||||
|
import java.lang.management.ThreadInfo;
|
||||||
|
import java.lang.management.ThreadMXBean;
|
||||||
|
|
||||||
|
public class ThreadDumper {
|
||||||
|
public static String obtainThreadDump() {
|
||||||
|
ThreadMXBean threadmxbean = ManagementFactory.getThreadMXBean();
|
||||||
|
ThreadInfo[] athreadinfo = threadmxbean.dumpAllThreads(true, true);
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append("Thread Dump:\n");
|
||||||
|
for(ThreadInfo threadinfo : athreadinfo) {
|
||||||
|
sb.append(threadinfo);
|
||||||
|
StackTraceElement[] elements = threadinfo.getStackTrace();
|
||||||
|
if(elements.length > 8) {
|
||||||
|
sb.append("extended trace:\n");
|
||||||
|
for(int i = 8; i < elements.length; i++) {
|
||||||
|
sb.append("\tat ");
|
||||||
|
sb.append(elements[i]);
|
||||||
|
sb.append('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append('\n');
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user