Shuffling
This commit is contained in:
@@ -113,7 +113,7 @@ public class VoxelCore {
|
|||||||
//this.world.getMapper().forceResaveStates();
|
//this.world.getMapper().forceResaveStates();
|
||||||
this.importer.shutdown();
|
this.importer.shutdown();
|
||||||
Logger.info("Shutting down world engine");
|
Logger.info("Shutting down world engine");
|
||||||
try {this.world.shutdown();} catch (Exception e) {Logger.error("Error shutting down world engine", e);}
|
try {this.world.free();} catch (Exception e) {Logger.error("Error shutting down world engine", e);}
|
||||||
Logger.info("Shutting down service thread pool");
|
Logger.info("Shutting down service thread pool");
|
||||||
this.serviceThreadPool.shutdown();
|
this.serviceThreadPool.shutdown();
|
||||||
Logger.info("Voxel core shut down");
|
Logger.info("Voxel core shut down");
|
||||||
|
|||||||
@@ -18,6 +18,10 @@ public abstract class TrackedObject {
|
|||||||
this.ref = register(shouldTrack, this);
|
this.ref = register(shouldTrack, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected TrackedObject(Object forObj, boolean shouldTrack) {
|
||||||
|
this.ref = register(shouldTrack, forObj);
|
||||||
|
}
|
||||||
|
|
||||||
protected void free0() {
|
protected void free0() {
|
||||||
if (this.isFreed()) {
|
if (this.isFreed()) {
|
||||||
throw new IllegalStateException("Object " + this + " was double freed.");
|
throw new IllegalStateException("Object " + this + " was double freed.");
|
||||||
@@ -78,4 +82,20 @@ public abstract class TrackedObject {
|
|||||||
}
|
}
|
||||||
return new Ref(cleanable, freed);
|
return new Ref(cleanable, freed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final class TrackedObjectObject extends TrackedObject {
|
||||||
|
private TrackedObjectObject(Object forObj) {
|
||||||
|
super(forObj, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void free() {
|
||||||
|
this.free0();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TrackedObject createTrackedObject(Object forObj) {
|
||||||
|
return new TrackedObjectObject(forObj);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package me.cortex.voxy.common.world;
|
|||||||
|
|
||||||
import me.cortex.voxy.common.Logger;
|
import me.cortex.voxy.common.Logger;
|
||||||
import me.cortex.voxy.common.config.section.SectionStorage;
|
import me.cortex.voxy.common.config.section.SectionStorage;
|
||||||
|
import me.cortex.voxy.common.util.TrackedObject;
|
||||||
import me.cortex.voxy.common.voxelization.VoxelizedSection;
|
import me.cortex.voxy.common.voxelization.VoxelizedSection;
|
||||||
import me.cortex.voxy.common.world.other.Mapper;
|
import me.cortex.voxy.common.world.other.Mapper;
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ public class WorldEngine {
|
|||||||
public interface ISectionChangeCallback {void accept(WorldSection section, int updateFlags);}
|
public interface ISectionChangeCallback {void accept(WorldSection section, int updateFlags);}
|
||||||
public interface ISectionSaveCallback {void save(WorldEngine engine, WorldSection section);}
|
public interface ISectionSaveCallback {void save(WorldEngine engine, WorldSection section);}
|
||||||
|
|
||||||
|
private final TrackedObject thisTracker = TrackedObject.createTrackedObject(this);
|
||||||
|
|
||||||
public final SectionStorage storage;
|
public final SectionStorage storage;
|
||||||
private final Mapper mapper;
|
private final Mapper mapper;
|
||||||
@@ -207,7 +209,8 @@ public class WorldEngine {
|
|||||||
debug.add("ACC/SCC: " + this.sectionTracker.getLoadedCacheCount()+"/"+this.sectionTracker.getSecondaryCacheSize());//Active cache count, Secondary cache counts
|
debug.add("ACC/SCC: " + this.sectionTracker.getLoadedCacheCount()+"/"+this.sectionTracker.getSecondaryCacheSize());//Active cache count, Secondary cache counts
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void free() {
|
||||||
|
this.thisTracker.free();
|
||||||
this.isLive = false;
|
this.isLive = false;
|
||||||
try {this.mapper.close();} catch (Exception e) {Logger.error(e);}
|
try {this.mapper.close();} catch (Exception e) {Logger.error(e);}
|
||||||
try {this.storage.flush();} catch (Exception e) {Logger.error(e);}
|
try {this.storage.flush();} catch (Exception e) {Logger.error(e);}
|
||||||
|
|||||||
@@ -7,8 +7,6 @@ import net.fabricmc.loader.api.FabricLoader;
|
|||||||
import net.fabricmc.loader.api.ModContainer;
|
import net.fabricmc.loader.api.ModContainer;
|
||||||
|
|
||||||
public class VoxyCommon implements ModInitializer {
|
public class VoxyCommon implements ModInitializer {
|
||||||
private static VoxyInstance INSTANCE;
|
|
||||||
|
|
||||||
public static final String MOD_VERSION;
|
public static final String MOD_VERSION;
|
||||||
public static final boolean IS_DEDICATED_SERVER;
|
public static final boolean IS_DEDICATED_SERVER;
|
||||||
|
|
||||||
@@ -27,21 +25,24 @@ public class VoxyCommon implements ModInitializer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
//This is hardcoded like this because people do not understand what they are doing
|
||||||
public void onInitialize() {
|
private static final boolean GlobalVerificationDisableOverride = false;//System.getProperty("voxy.verificationDisableOverride", "false").equals("true");
|
||||||
|
public static boolean isVerificationFlagOn(String name) {
|
||||||
|
return (!GlobalVerificationDisableOverride) && System.getProperty("voxy."+name, "true").equals("true");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void breakpoint() {
|
public static void breakpoint() {
|
||||||
int breakpoint = 0;
|
int breakpoint = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
//This is hardcoded like this because people do not understand what they are doing
|
public void onInitialize() {
|
||||||
private static final boolean GlobalVerificationDisableOverride = false;//System.getProperty("voxy.verificationDisableOverride", "false").equals("true");
|
|
||||||
public static boolean isVerificationFlagOn(String name) {
|
|
||||||
return (!GlobalVerificationDisableOverride) && System.getProperty("voxy."+name, "true").equals("true");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IInstanceFactory {VoxyInstance create();}
|
||||||
|
private static VoxyInstance INSTANCE;
|
||||||
|
private static IInstanceFactory FACTORY;
|
||||||
|
|
||||||
public static VoxyInstance getInstance() {
|
public static VoxyInstance getInstance() {
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
@@ -57,6 +58,9 @@ public class VoxyCommon implements ModInitializer {
|
|||||||
if (INSTANCE != null) {
|
if (INSTANCE != null) {
|
||||||
throw new IllegalStateException("Cannot create multiple instances");
|
throw new IllegalStateException("Cannot create multiple instances");
|
||||||
}
|
}
|
||||||
INSTANCE = new VoxyInstance(12);
|
if (FACTORY == null) {
|
||||||
|
throw new IllegalStateException("Instance factory null");
|
||||||
|
}
|
||||||
|
INSTANCE = FACTORY.create();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ import java.util.Set;
|
|||||||
|
|
||||||
//TODO: add thread access verification (I.E. only accessible on a single thread)
|
//TODO: add thread access verification (I.E. only accessible on a single thread)
|
||||||
public class VoxyInstance {
|
public class VoxyInstance {
|
||||||
private final ServiceThreadPool threadPool;
|
protected final ServiceThreadPool threadPool;
|
||||||
private final SectionSavingService savingService;
|
protected final SectionSavingService savingService;
|
||||||
private final VoxelIngestService ingestService;
|
protected final VoxelIngestService ingestService;
|
||||||
private final Set<WorldEngine> activeWorlds = new HashSet<>();
|
protected final Set<WorldEngine> activeWorlds = new HashSet<>();
|
||||||
|
|
||||||
public VoxyInstance(int threadCount) {
|
public VoxyInstance(int threadCount) {
|
||||||
this.threadPool = new ServiceThreadPool(threadCount);
|
this.threadPool = new ServiceThreadPool(threadCount);
|
||||||
@@ -66,7 +66,7 @@ public class VoxyInstance {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private WorldEngine createWorld(SectionStorage storage) {
|
protected WorldEngine createWorld(SectionStorage storage) {
|
||||||
var world = new WorldEngine(storage, 1024);
|
var world = new WorldEngine(storage, 1024);
|
||||||
world.setSaveCallback(this.savingService::enqueueSave);
|
world.setSaveCallback(this.savingService::enqueueSave);
|
||||||
this.activeWorlds.add(world);
|
this.activeWorlds.add(world);
|
||||||
@@ -83,6 +83,30 @@ public class VoxyInstance {
|
|||||||
// so if make into singleplayer as host, would need to reload the system into that mode
|
// so if make into singleplayer as host, would need to reload the system into that mode
|
||||||
// so that the world renderer uses the WorldEngine of the server
|
// so that the world renderer uses the WorldEngine of the server
|
||||||
|
|
||||||
|
public void stopWorld(WorldEngine world) {
|
||||||
|
if (!this.activeWorlds.contains(world)) {
|
||||||
|
if (world.isLive()) {
|
||||||
|
throw new IllegalStateException("World cannot be live and not in world set");
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Cannot close world which is not part of instance");
|
||||||
|
}
|
||||||
|
if (!world.isLive()) {
|
||||||
|
throw new IllegalStateException("World cannot be in world set and not alive");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (this.importWrapper != null) {
|
||||||
|
this.importWrapper.stopImporter();
|
||||||
|
this.importWrapper = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.flush();
|
||||||
|
|
||||||
|
|
||||||
|
world.free();
|
||||||
|
this.activeWorlds.remove(world);
|
||||||
|
}
|
||||||
|
|
||||||
private static final ContextSelectionSystem SELECTOR = new ContextSelectionSystem();
|
private static final ContextSelectionSystem SELECTOR = new ContextSelectionSystem();
|
||||||
public WorldImportWrapper importWrapper;
|
public WorldImportWrapper importWrapper;
|
||||||
public WorldEngine getOrMakeWorld(ClientWorld world) {
|
public WorldEngine getOrMakeWorld(ClientWorld world) {
|
||||||
@@ -95,25 +119,4 @@ public class VoxyInstance {
|
|||||||
return vworld;
|
return vworld;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void stopWorld(WorldEngine world) {
|
|
||||||
if (!this.activeWorlds.contains(world)) {
|
|
||||||
if (world.isLive()) {
|
|
||||||
throw new IllegalStateException("World cannot be live and not in world set");
|
|
||||||
}
|
|
||||||
throw new IllegalStateException("Cannot close world which is not part of instance");
|
|
||||||
}
|
|
||||||
if (!world.isLive()) {
|
|
||||||
throw new IllegalStateException("World cannot be in world set and not alive");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.importWrapper != null) {
|
|
||||||
this.importWrapper.stopImporter();
|
|
||||||
}
|
|
||||||
this.flush();
|
|
||||||
|
|
||||||
world.shutdown();
|
|
||||||
this.activeWorlds.remove(world);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user