mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
No leaky
This commit is contained in:
parent
cf6f28aa3e
commit
583b74fb7e
@ -82,6 +82,20 @@ public class IrisData {
|
|||||||
hotloaded();
|
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() {
|
public static int cacheSize() {
|
||||||
int m = 0;
|
int m = 0;
|
||||||
for(IrisData i : dataLoaders.values())
|
for(IrisData i : dataLoaders.values())
|
||||||
|
@ -19,17 +19,21 @@
|
|||||||
package com.volmit.iris.core.service;
|
package com.volmit.iris.core.service;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
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.collection.KList;
|
||||||
|
import com.volmit.iris.util.context.IrisContext;
|
||||||
import com.volmit.iris.util.parallel.MultiBurst;
|
import com.volmit.iris.util.parallel.MultiBurst;
|
||||||
import com.volmit.iris.util.plugin.IrisService;
|
import com.volmit.iris.util.plugin.IrisService;
|
||||||
|
import com.volmit.iris.util.scheduling.Looper;
|
||||||
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
public class ExecutionSVC implements IrisService
|
public class PreservationSVC implements IrisService
|
||||||
{
|
{
|
||||||
private KList<Thread> threads = new KList<>();
|
private KList<Thread> threads = new KList<>();
|
||||||
private KList<MultiBurst> bursts = new KList<>();
|
private KList<MultiBurst> bursts = new KList<>();
|
||||||
private KList<ExecutorService> services = new KList<>();
|
private KList<ExecutorService> services = new KList<>();
|
||||||
|
private Looper dereferencer;
|
||||||
|
|
||||||
public void register(Thread t)
|
public void register(Thread t)
|
||||||
{
|
{
|
||||||
@ -46,13 +50,31 @@ public class ExecutionSVC implements IrisService
|
|||||||
services.add(service);
|
services.add(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void dereference()
|
||||||
|
{
|
||||||
|
IrisContext.dereference();
|
||||||
|
IrisData.dereference();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
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
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
|
dereferencer.interrupt();
|
||||||
|
|
||||||
for(Thread i : threads)
|
for(Thread i : threads)
|
||||||
{
|
{
|
||||||
if(i.isAlive())
|
if(i.isAlive())
|
||||||
@ -97,5 +119,7 @@ public class ExecutionSVC implements IrisService
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dereference();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -23,6 +23,7 @@ import com.google.gson.Gson;
|
|||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
import com.volmit.iris.core.IrisSettings;
|
||||||
import com.volmit.iris.core.events.IrisEngineHotloadEvent;
|
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.IrisBiomeActuator;
|
||||||
import com.volmit.iris.engine.actuator.IrisDecorantActuator;
|
import com.volmit.iris.engine.actuator.IrisDecorantActuator;
|
||||||
import com.volmit.iris.engine.actuator.IrisTerrainIslandActuator;
|
import com.volmit.iris.engine.actuator.IrisTerrainIslandActuator;
|
||||||
@ -66,8 +67,6 @@ import org.bukkit.generator.BlockPopulator;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Random;
|
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.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
@ -340,6 +339,9 @@ public class IrisEngine extends BlockPopulator implements Engine {
|
|||||||
getPostModifier().close();
|
getPostModifier().close();
|
||||||
getMantle().close();
|
getMantle().close();
|
||||||
getComplex().close();
|
getComplex().close();
|
||||||
|
getData().dump();
|
||||||
|
getData().clearLists();
|
||||||
|
Iris.service(PreservationSVC.class).dereference();
|
||||||
Iris.debug("Engine Fully Shutdown!");
|
Iris.debug("Engine Fully Shutdown!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.annotations.*;
|
||||||
import com.volmit.iris.engine.object.common.IRare;
|
import com.volmit.iris.engine.object.common.IRare;
|
||||||
import com.volmit.iris.util.collection.KList;
|
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.interpolation.IrisInterpolation;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
import com.volmit.iris.util.noise.CellGenerator;
|
import com.volmit.iris.util.noise.CellGenerator;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package com.volmit.iris.util.context;
|
package com.volmit.iris.util.context;
|
||||||
|
|
||||||
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.project.loader.IrisData;
|
import com.volmit.iris.core.project.loader.IrisData;
|
||||||
import com.volmit.iris.engine.IrisComplex;
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
@ -30,7 +31,7 @@ import lombok.Data;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class IrisContext {
|
public class IrisContext {
|
||||||
private static ChronoLatch cl = new ChronoLatch(60000);
|
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;
|
private final Engine engine;
|
||||||
|
|
||||||
public static IrisContext get() {
|
public static IrisContext get() {
|
||||||
@ -42,12 +43,24 @@ public class IrisContext {
|
|||||||
context.put(Thread.currentThread(), c);
|
context.put(Thread.currentThread(), c);
|
||||||
|
|
||||||
if (cl.flip()) {
|
if (cl.flip()) {
|
||||||
for (Thread i : context.k()) {
|
dereference();
|
||||||
if (!i.isAlive()) {
|
|
||||||
context.remove(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ package com.volmit.iris.util.parallel;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisSettings;
|
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.io.InstanceState;
|
||||||
import com.volmit.iris.util.math.M;
|
import com.volmit.iris.util.math.M;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
@ -71,7 +71,7 @@ public class MultiBurst {
|
|||||||
};
|
};
|
||||||
heartbeat.setName(name + " Monitor");
|
heartbeat.setName(name + " Monitor");
|
||||||
heartbeat.start();
|
heartbeat.start();
|
||||||
Iris.service(ExecutionSVC.class).register(this);
|
Iris.service(PreservationSVC.class).register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized ExecutorService getService() {
|
private synchronized ExecutorService getService() {
|
||||||
@ -90,7 +90,7 @@ public class MultiBurst {
|
|||||||
|
|
||||||
return t;
|
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.");
|
Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,14 +19,12 @@
|
|||||||
package com.volmit.iris.util.scheduling;
|
package com.volmit.iris.util.scheduling;
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.service.ExecutionSVC;
|
import com.volmit.iris.core.service.PreservationSVC;
|
||||||
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
|
|
||||||
public abstract class Looper extends Thread {
|
public abstract class Looper extends Thread {
|
||||||
@SuppressWarnings("BusyWait")
|
@SuppressWarnings("BusyWait")
|
||||||
public void run() {
|
public void run() {
|
||||||
Iris.service(ExecutionSVC.class).register(this);
|
Iris.service(PreservationSVC.class).register(this);
|
||||||
while (!interrupted()) {
|
while (!interrupted()) {
|
||||||
try {
|
try {
|
||||||
long m = loop();
|
long m = loop();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user