LibJF/libjf-base/src/main/java/io/gitlab/jfronny/libjf/coprocess/CoProcessManager.java

45 lines
1.5 KiB
Java

package io.gitlab.jfronny.libjf.coprocess;
import io.gitlab.jfronny.libjf.LibJf;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.loader.api.FabricLoader;
import java.io.Closeable;
import java.io.IOException;
import java.util.*;
public class CoProcessManager implements ModInitializer {
private final List<CoProcess> coProcesses = new ArrayList<>();
@Override
public void onInitialize() {
coProcesses.addAll(FabricLoader.getInstance().getEntrypoints(LibJf.MOD_ID + ":coprocess", CoProcess.class));
Runtime.getRuntime().addShutdownHook(new Thread(this::stop));
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) ServerLifecycleEvents.SERVER_STOPPED.register(server -> this.stop());
start();
}
private void start() {
for (CoProcess coProcess : coProcesses) {
coProcess.start();
}
}
private void stop() {
Iterator<CoProcess> procs = coProcesses.iterator();
while (procs.hasNext()) {
CoProcess coProcess = procs.next();
coProcess.stop();
if (coProcess instanceof Closeable cl) {
try {
cl.close();
} catch (IOException e) {
LibJf.LOGGER.error("Could not close co-process", e);
}
}
procs.remove();
}
}
}