This commit is contained in:
cyberpwn 2021-08-17 23:40:47 -04:00
parent cf6f28aa3e
commit 583b74fb7e
7 changed files with 67 additions and 15 deletions

View File

@ -82,6 +82,20 @@ public class IrisData {
hotloaded();
}
public static void dereference()
{
dataLoaders.v().forEach(IrisData::cleanupEngine);
}
public void cleanupEngine()
{
if(engine != null && engine.isClosed())
{
engine = null;
Iris.debug("Dereferenced Data<Engine> " + getId() + " " + getDataFolder());
}
}
public static int cacheSize() {
int m = 0;
for(IrisData i : dataLoaders.values())

View File

@ -19,17 +19,21 @@
package com.volmit.iris.core.service;
import com.volmit.iris.Iris;
import com.volmit.iris.core.project.loader.IrisData;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.context.IrisContext;
import com.volmit.iris.util.parallel.MultiBurst;
import com.volmit.iris.util.plugin.IrisService;
import com.volmit.iris.util.scheduling.Looper;
import java.util.concurrent.ExecutorService;
public class ExecutionSVC implements IrisService
public class PreservationSVC implements IrisService
{
private KList<Thread> threads = new KList<>();
private KList<MultiBurst> bursts = new KList<>();
private KList<ExecutorService> services = new KList<>();
private Looper dereferencer;
public void register(Thread t)
{
@ -46,13 +50,31 @@ public class ExecutionSVC implements IrisService
services.add(service);
}
public void dereference()
{
IrisContext.dereference();
IrisData.dereference();
}
@Override
public void onEnable() {
/*
* Dereferences copies of Engine instances that are closed to prevent memory from
* hanging around and keeping copies of complex, caches and other dead objects.
*/
dereferencer = new Looper() {
@Override
protected long loop() {
dereference();
return 60000;
}
};
}
@Override
public void onDisable() {
dereferencer.interrupt();
for(Thread i : threads)
{
if(i.isAlive())
@ -97,5 +119,7 @@ public class ExecutionSVC implements IrisService
}
}
dereference();
}
}

View File

@ -23,6 +23,7 @@ import com.google.gson.Gson;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.events.IrisEngineHotloadEvent;
import com.volmit.iris.core.service.PreservationSVC;
import com.volmit.iris.engine.actuator.IrisBiomeActuator;
import com.volmit.iris.engine.actuator.IrisDecorantActuator;
import com.volmit.iris.engine.actuator.IrisTerrainIslandActuator;
@ -66,8 +67,6 @@ import org.bukkit.generator.BlockPopulator;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
@ -340,6 +339,9 @@ public class IrisEngine extends BlockPopulator implements Engine {
getPostModifier().close();
getMantle().close();
getComplex().close();
getData().dump();
getData().clearLists();
Iris.service(PreservationSVC.class).dereference();
Iris.debug("Engine Fully Shutdown!");
}

View File

@ -24,6 +24,7 @@ import com.volmit.iris.engine.data.cache.AtomicCache;
import com.volmit.iris.engine.object.annotations.*;
import com.volmit.iris.engine.object.common.IRare;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.context.IrisContext;
import com.volmit.iris.util.interpolation.IrisInterpolation;
import com.volmit.iris.util.math.RNG;
import com.volmit.iris.util.noise.CellGenerator;

View File

@ -18,6 +18,7 @@
package com.volmit.iris.util.context;
import com.volmit.iris.Iris;
import com.volmit.iris.core.project.loader.IrisData;
import com.volmit.iris.engine.IrisComplex;
import com.volmit.iris.engine.framework.Engine;
@ -30,7 +31,7 @@ import lombok.Data;
@AllArgsConstructor
public class IrisContext {
private static ChronoLatch cl = new ChronoLatch(60000);
private static KMap<Thread, IrisContext> context = new KMap<>();
private static final KMap<Thread, IrisContext> context = new KMap<>();
private final Engine engine;
public static IrisContext get() {
@ -42,10 +43,22 @@ public class IrisContext {
context.put(Thread.currentThread(), c);
if (cl.flip()) {
for (Thread i : context.k()) {
if (!i.isAlive()) {
context.remove(i);
dereference();
}
}
}
public static void dereference() {
synchronized (context)
{
for (Thread i : context.k()) {
if (!i.isAlive() || context.get(i).engine.isClosed()) {
if(context.get(i).engine.isClosed())
{
Iris.debug("Dereferenced Context<Engine> " + i.getName() + " " + i.getId());
}
context.remove(i);
}
}
}

View File

@ -20,7 +20,7 @@ package com.volmit.iris.util.parallel;
import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.core.service.ExecutionSVC;
import com.volmit.iris.core.service.PreservationSVC;
import com.volmit.iris.util.io.InstanceState;
import com.volmit.iris.util.math.M;
import com.volmit.iris.util.scheduling.J;
@ -71,7 +71,7 @@ public class MultiBurst {
};
heartbeat.setName(name + " Monitor");
heartbeat.start();
Iris.service(ExecutionSVC.class).register(this);
Iris.service(PreservationSVC.class).register(this);
}
private synchronized ExecutorService getService() {
@ -90,7 +90,7 @@ public class MultiBurst {
return t;
});
Iris.service(ExecutionSVC.class).register(service);
Iris.service(PreservationSVC.class).register(service);
Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority.");
}

View File

@ -19,14 +19,12 @@
package com.volmit.iris.util.scheduling;
import com.volmit.iris.Iris;
import com.volmit.iris.core.service.ExecutionSVC;
import java.util.concurrent.ExecutorService;
import com.volmit.iris.core.service.PreservationSVC;
public abstract class Looper extends Thread {
@SuppressWarnings("BusyWait")
public void run() {
Iris.service(ExecutionSVC.class).register(this);
Iris.service(PreservationSVC.class).register(this);
while (!interrupted()) {
try {
long m = loop();