Replace the ApiShared Logger with class specific loggers

This should make the logs easier to understand.
This commit is contained in:
James Seibel
2022-04-24 19:13:18 -05:00
parent babc65217c
commit ad0eb208ea
17 changed files with 263 additions and 128 deletions
@@ -19,12 +19,14 @@
package com.seibel.lod.core.builders.lodBuilding.bufferBuilding;
import java.lang.invoke.MethodHandles;
import java.time.Duration;
import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.logging.SpamReducedLogger;
import com.seibel.lod.core.objects.Pos2D;
import com.seibel.lod.core.objects.lod.LodDimension;
@@ -36,6 +38,7 @@ import com.seibel.lod.core.util.*;
import com.seibel.lod.core.util.gridList.MovableGridRingList;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import org.apache.logging.log4j.Logger;
/**
* This object creates the buffers that are rendered by the LodRenderer.
@@ -63,14 +66,15 @@ public class LodBufferBuilderFactory {
return;
timer = System.nanoTime() - timer;
if (timer > LAG_SPIKE_THRESOLD_NS) {
ApiShared.LOGGER.info("LagSpikeCatcher: " + source + " took " + Duration.ofNanos(timer) + "!");
LOGGER.info("LagSpikeCatcher: " + source + " took " + Duration.ofNanos(timer) + "!");
}
}
}
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
/** The thread used to generate new LODs off the main thread. */
private static LodThreadFactory mainGenThreadFactory = new LodThreadFactory(
LodBufferBuilderFactory.class.getSimpleName() + " - main", Thread.NORM_PRIORITY - 2);
@@ -156,7 +160,7 @@ public class LodBufferBuilderFactory {
renderRegions = new MovableGridRingList<RenderRegion>(regionWidth/2,
LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerX),
LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerZ));
ApiShared.LOGGER.info("============Render Regions rebuilt============");
LOGGER.info("============Render Regions rebuilt============");
} else {
renderRegions.move(LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerX),
LevelPosUtil.getRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerZ), RenderRegion::close);
@@ -188,7 +192,7 @@ public class LodBufferBuilderFactory {
resetThreadPools(false);
regionsListLock.lockInterruptibly();
if (ENABLE_EVENT_LOGGING)
ApiShared.LOGGER.info("BufferBuilderStarter locked the region lock! LodDim: [{}], RenderRegion: [{}]",
LOGGER.info("BufferBuilderStarter locked the region lock! LodDim: [{}], RenderRegion: [{}]",
lodDim, renderRegions==null ? "NULL" : renderRegions.toString());
long startTime = System.currentTimeMillis();
@@ -255,7 +259,7 @@ public class LodBufferBuilderFactory {
} catch (CancellationException ce) {
throw new InterruptedException("Future interrupted");
} catch (ExecutionException ee) {
ApiShared.LOGGER.error("LodBufferBuilder ran into trouble: ", ee.getCause());
LOGGER.error("LodBufferBuilder ran into trouble: ", ee.getCause());
}
long executeEnd = System.currentTimeMillis();
@@ -263,7 +267,7 @@ public class LodBufferBuilderFactory {
long buildTime = endTime - startTime;
long executeTime = executeEnd - executeStart;
if (ENABLE_BUFFER_PERF_LOGGING)
ApiShared.LOGGER.info("Thread Build&Upload(" + numOfJobs + "/"
LOGGER.info("Thread Build&Upload(" + numOfJobs + "/"
+ (lodDim.getWidth() * lodDim.getWidth()) + (fullRegen ? "FULL" : "") + ") time: " + buildTime
+ " ms" + '\n' + "thread execute time: " + executeTime + " ms");
@@ -274,18 +278,18 @@ public class LodBufferBuilderFactory {
} catch (Throwable ignored) {
}
} catch (TimeoutException te) {
ApiShared.LOGGER.error("LodBufferBuilder timed out: ", te);
LOGGER.error("LodBufferBuilder timed out: ", te);
resetThreadPools(true);
}
}
catch (RuntimeException e) {
ApiShared.LOGGER.error("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: ", e);
LOGGER.error("\"LodNodeBufferBuilder.generateLodBuffersAsync\" ran into trouble: ", e);
}
}
catch (InterruptedException ignored) { }
finally {
regionsListLock.unlock();
if (ENABLE_EVENT_LOGGING) ApiShared.LOGGER.info("BufferBuilderStarter unlocked the region lock!");
if (ENABLE_EVENT_LOGGING) LOGGER.info("BufferBuilderStarter unlocked the region lock!");
builderThreadRunning = false;
}
}
@@ -326,7 +330,7 @@ public class LodBufferBuilderFactory {
* May have to wait for the bufferLock to open.
*/
public void destroyBuffers() {
ApiShared.LOGGER.info("Destroying LodBufferBuilder...");
LOGGER.info("Destroying LodBufferBuilder...");
mainGenThread.shutdownNow();
mainGenThread = Executors.newSingleThreadExecutor(mainGenThreadFactory);
boolean locked = false;
@@ -339,7 +343,7 @@ public class LodBufferBuilderFactory {
} finally {
if (locked) regionsListLock.unlock();
}
ApiShared.LOGGER.info("LodBufferBuilder destroyed.");
LOGGER.info("LodBufferBuilder destroyed.");
}
/** Get the newly created VBOs
@@ -19,11 +19,12 @@
package com.seibel.lod.core.builders.worldGeneration;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.enums.config.GenerationPriority;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.PosToGenerateContainer;
import com.seibel.lod.core.objects.lod.LodDimension;
import com.seibel.lod.core.util.LevelPosUtil;
@@ -34,9 +35,12 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IWorldWrapper;
import com.seibel.lod.core.wrapperInterfaces.worldGeneration.AbstractBatchGenerationEnvionmentWrapper;
import com.seibel.lod.core.wrapperInterfaces.worldGeneration.AbstractBatchGenerationEnvionmentWrapper.Steps;
import org.apache.logging.log4j.Logger;
public class BatchGenerator {
import java.lang.invoke.MethodHandles;
public class BatchGenerator
{
public static final boolean ENABLE_GENERATOR_STATS_LOGGING = false;
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
@@ -46,7 +50,8 @@ public class BatchGenerator {
public LodDimension targetLodDim;
public static final int generationGroupSize = 4;
public static int previousThreadCount = CONFIG.client().advanced().threading()._getWorldGenerationThreadPoolSize();
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private int estimatedSampleNeeded = 128;
private int estimatedPointsToQueue = 1;
@@ -55,7 +60,7 @@ public class BatchGenerator {
targetLodDim = newLodDimension;
generationGroup = FACTORY.createBatchGenerator(newLodBuilder, newLodDimension, world);
MC.sendChatMessage("NOTE: You are currently using Distant Horizon's Batch Chunk Pre-Generator.");
ApiShared.LOGGER.info("Batch Chunk Generator initialized");
LOGGER.info("Batch Chunk Generator initialized");
}
@SuppressWarnings("unused")
@@ -65,7 +70,7 @@ public class BatchGenerator {
IWorldWrapper dim = LodUtil.getServerWorldFromDimension(lodDim.dimension);
generationGroup = FACTORY.createBatchGenerator(lodBuilder, lodDim, dim);
targetLodDim = lodDim;
ApiShared.LOGGER.info("1.18 Experimental Chunk Generator reinitialized");
LOGGER.info("1.18 Experimental Chunk Generator reinitialized");
}
DistanceGenerationMode mode = CONFIG.client().worldGenerator().getDistanceGenerationMode();
@@ -143,14 +148,14 @@ public class BatchGenerator {
}
if (ENABLE_GENERATOR_STATS_LOGGING)
ApiShared.LOGGER.info("WorldGen. Near:" + posToGenerate.getNumberOfNearPos() + " Far:"
LOGGER.info("WorldGen. Near:" + posToGenerate.getNumberOfNearPos() + " Far:"
+ posToGenerate.getNumberOfFarPos());
if (priority == GenerationPriority.FAR_FIRST || priority == GenerationPriority.BALANCED) {
int nearCount = posToGenerate.getNumberOfNearPos();
int farCount = posToGenerate.getNumberOfFarPos();
if (ENABLE_GENERATOR_STATS_LOGGING)
ApiShared.LOGGER.info("WorldGen. Near:" + nearCount + " Far:" + farCount);
LOGGER.info("WorldGen. Near:" + nearCount + " Far:" + farCount);
int maxIteration = Math.max(nearCount, farCount);
for (int i = 0; i < maxIteration; i++) {
@@ -225,11 +230,11 @@ public class BatchGenerator {
if (targetToGenerate != toGenerate && ENABLE_GENERATOR_STATS_LOGGING) {
if (toGenerate <= 0) {
ApiShared.LOGGER.info(
LOGGER.info(
"WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of " + estimatedSampleNeeded
+ " points, started all targeted " + targetToGenerate + " generations.");
} else {
ApiShared.LOGGER.info("WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of "
LOGGER.info("WorldGenerator: Sampled " + posToGenerate.getNumberOfPos() + " out of "
+ estimatedSampleNeeded + " points, started " + (targetToGenerate - toGenerate)
+ " out of targeted " + targetToGenerate + " generations.");
}
@@ -243,7 +248,7 @@ public class BatchGenerator {
if (estimatedSampleNeeded > 32768)
estimatedSampleNeeded = 32768;
if (ENABLE_GENERATOR_STATS_LOGGING)
ApiShared.LOGGER.info("WorldGenerator: Increasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
LOGGER.info("WorldGenerator: Increasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
} else if (toGenerate <= 0 && positionGoneThough * 1.5 < posToGenerate.getNumberOfPos()) {
// We haven't gone though half of them and it's already enough.
@@ -253,13 +258,13 @@ public class BatchGenerator {
if (estimatedSampleNeeded < 4)
estimatedSampleNeeded = 4;
if (ENABLE_GENERATOR_STATS_LOGGING)
ApiShared.LOGGER.info("WorldGenerator: Decreasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
LOGGER.info("WorldGenerator: Decreasing estimatedSampleNeeeded to " + estimatedSampleNeeded);
}
}
public void stop(boolean blocking) {
ApiShared.LOGGER.info("1.18 Experimental Chunk Generator shutting down...");
LOGGER.info("1.18 Experimental Chunk Generator shutting down...");
generationGroup.stop(blocking);
}
@@ -21,7 +21,7 @@ package com.seibel.lod.core.handlers;
import com.electronwill.nightconfig.core.file.CommentedFileConfig;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.handlers.dimensionFinder.PlayerData;
import com.seibel.lod.core.handlers.dimensionFinder.SubDimCompare;
import com.seibel.lod.core.builders.lodBuilding.LodBuilder;
@@ -48,7 +48,6 @@ import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.Comparator;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -133,11 +132,11 @@ public class LodDimensionFinder
if (saveDir == null)
return;
foundLodDimension = new LodDimension(dimensionTypeWrapper, ApiShared.lodBuilder.defaultDimensionWidthInRegions, saveDir);
foundLodDimension = new LodDimension(dimensionTypeWrapper, InternalApiShared.lodBuilder.defaultDimensionWidthInRegions, saveDir);
}
catch (IOException e)
{
ApiShared.LOGGER.error("Unable to set the dimension file handler for dimension type [" + dimensionTypeWrapper.getDimensionName() + "]. Error: " + e.getMessage(), e);
LOGGER.error("Unable to set the dimension file handler for dimension type [" + dimensionTypeWrapper.getDimensionName() + "]. Error: " + e.getMessage(), e);
}
finally
{
@@ -242,7 +241,7 @@ public class LodDimensionFinder
newlyLoadedDim.regions.set(playerRegionPos.x, playerRegionPos.z, new LodRegion(LodUtil.BLOCK_DETAIL_LEVEL, playerRegionPos, VERTICAL_QUALITY_TO_TEST_WITH));
// generate a LOD to test against
boolean lodGenerated = ApiShared.lodBuilder.generateLodNodeFromChunk(newlyLoadedDim, newlyLoadedChunk, new LodBuilderConfig(DistanceGenerationMode.FULL), true, true);
boolean lodGenerated = InternalApiShared.lodBuilder.generateLodNodeFromChunk(newlyLoadedDim, newlyLoadedChunk, new LodBuilderConfig(DistanceGenerationMode.FULL), true, true);
if (!lodGenerated)
return null;
@@ -341,7 +340,7 @@ public class LodDimensionFinder
// check if the block positions are close
int playerBlockDist = testPlayerData.playerBlockPos.getManhattanDistance(playerData.playerBlockPos);
ApiShared.LOGGER.info("Player block position distance between saved sub dimension and first seen is [" + playerBlockDist + "]");
LOGGER.info("Player block position distance between saved sub dimension and first seen is [" + playerBlockDist + "]");
// check if the chunk is actually empty
@@ -23,28 +23,27 @@ import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.ReentrantLock;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.enums.config.VerticalQuality;
import com.seibel.lod.core.objects.lod.RegionPos;
import com.seibel.lod.core.objects.lod.VerticalLevelContainer;
import com.seibel.lod.core.util.LodUtil;
import org.apache.logging.log4j.Logger;
public class LodDimensionOldFileStructureHandler
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
/** This is the dimension that owns this file handler */
private final File dimensionDataSaveFolder;
private final LodDimensionFileHandler newFileHandler;
@@ -119,7 +118,7 @@ public class LodDimensionOldFileStructureHandler
// the file we are reading is too old.
// close the reader and delete the file.
inputStream.close();
ApiShared.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". this region file will not be read and merged into the new save structure.");
@@ -131,7 +130,7 @@ public class LodDimensionOldFileStructureHandler
// close the reader and ignore the file, we don't
// want to accidentally delete anything the user may want.
inputStream.close();
ApiShared.LOGGER.info("Unexpected newer LOD region file for region: (" + regionX + "," + regionZ + ")"
LOGGER.info("Unexpected newer LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ " this region file will not be read and merged into the new save structure.");
@@ -139,7 +138,7 @@ public class LodDimensionOldFileStructureHandler
}
else if (fileVersion < LOD_SAVE_FILE_VERSION)
{
ApiShared.LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
LOGGER.debug("Old LOD region file for region: (" + regionX + "," + regionZ + ")"
+ " version found: " + fileVersion
+ ", version requested: " + LOD_SAVE_FILE_VERSION
+ ". this region file be read, updated, and merged into the new save structure.");
@@ -154,7 +153,7 @@ public class LodDimensionOldFileStructureHandler
}
catch (IOException ioEx)
{
ApiShared.LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
LOGGER.error("LOD file read error. Unable to read xz compressed file [" + file + "] error [" + ioEx.getMessage() + "]: ");
ioEx.printStackTrace();
}
}
@@ -169,18 +168,18 @@ public class LodDimensionOldFileStructureHandler
private void loadAndMergeAndSaveRegion(VerticalQuality verticalQuality, RegionPos regionPos)
{
ApiShared.LOGGER.info("Merging region "+regionPos+" at "+verticalQuality+"...");
LOGGER.info("Merging region "+regionPos+" at "+verticalQuality+"...");
TempLodRegion region = new TempLodRegion(verticalQuality, regionPos);
ApiShared.LOGGER.info("Reading data...");
LOGGER.info("Reading data...");
loadGenModeToRegion(region, OldDistanceGenerationMode.FULL);
loadGenModeToRegion(region, OldDistanceGenerationMode.FEATURES);
loadGenModeToRegion(region, OldDistanceGenerationMode.SURFACE);
loadGenModeToRegion(region, OldDistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT);
loadGenModeToRegion(region, OldDistanceGenerationMode.BIOME_ONLY);
loadGenModeToRegion(region, OldDistanceGenerationMode.NONE);
ApiShared.LOGGER.info("Writing data...");
LOGGER.info("Writing data...");
saveRegion(region);
ApiShared.LOGGER.info("region "+regionPos+" at "+verticalQuality+" merged");
LOGGER.info("region "+regionPos+" at "+verticalQuality+" merged");
}
@@ -269,7 +268,7 @@ public class LodDimensionOldFileStructureHandler
}
catch (IOException e)
{
ApiShared.LOGGER.warn("Unable to get the base save file path. Error: " + e.getMessage(), e);
LOGGER.warn("Unable to get the base save file path. Error: " + e.getMessage(), e);
throw new RuntimeException("DistantHorizons Get Save File Path Failure");
}
}
@@ -19,8 +19,10 @@
package com.seibel.lod.core.handlers;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -38,7 +40,7 @@ import com.seibel.lod.core.enums.rendering.FogDrawMode;
*/
public class ReflectionHandler implements IReflectionHandler
{
private static final Logger LOGGER = LogManager.getLogger(ModInfo.NAME + "-" + ReflectionHandler.class.getSimpleName());
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public static ReflectionHandler instance;
@@ -19,8 +19,12 @@
package com.seibel.lod.core.handlers.dependencyInjection;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModAccessor;
import org.apache.logging.log4j.Logger;
import java.lang.invoke.MethodHandles;
/**
* This class takes care of dependency injection for mods accessors. (for mod compatibility
@@ -37,6 +41,7 @@ import com.seibel.lod.core.wrapperInterfaces.modAccessor.IModAccessor;
public class ModAccessorHandler
{
private static final DependencyHandler dependencyHandler = new DependencyHandler();
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
/**
@@ -51,7 +56,7 @@ public class ModAccessorHandler
throws IllegalStateException
{
dependencyHandler.bind(interfaceClass, modAccessor);
ApiShared.LOGGER.info("Registored mod comatibility accessor for " + modAccessor.getModName());
LOGGER.info("Registored mod comatibility accessor for " + modAccessor.getModName());
}
/**
@@ -60,7 +65,7 @@ public class ModAccessorHandler
*
* @param <T> class of the mod accessor
* (inferred from the objectClass parameter)
* @param interfaceClass Interface of the mod accessor
* @param objectClass class of the mod accessor, must extend IModAccessor
* @return the dependency of type T
* @throws ClassCastException If the mod accessor isn't able to be cast to type T.
* (this shouldn't normally happen, unless the bound object changed somehow)
@@ -0,0 +1,34 @@
package com.seibel.lod.core.logging;
import com.seibel.lod.core.ModInfo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Used to create loggers with specific names.
*
* @author James Seibel
* @version 2022-4-24
*/
public class DhLoggerBuilder
{
/**
* Creates a logger in the format <br>
* "ModInfo.Name-className" <br>
* For example: <br>
* "DistantHorizons-ReflectionHandler" <br><br>
*
* The suggested way to use this method is like this: <br><br>
* <code>
* private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
* </code> <br><br>
* By using MethodHandles you don't have to manually enter the class name,
* Java figures that out for you. Even in a static context.
*
* @param className name of the class this logger will be named after.
*/
public static Logger getLogger(String className)
{
return LogManager.getLogger(ModInfo.NAME + "-" + className);
}
}
@@ -16,82 +16,123 @@
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.seibel.lod.core.logging;
import java.lang.invoke.MethodHandles;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class SpamReducedLogger {
public class SpamReducedLogger
{
public static final Logger LOGGER = LogManager.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public static final List<WeakReference<SpamReducedLogger>> loggers
= Collections.synchronizedList(new LinkedList<WeakReference<SpamReducedLogger>>());
public static synchronized void flushAll() {
loggers.removeIf((logger) -> logger.get()==null);
public static synchronized void flushAll()
{
loggers.removeIf((logger) -> logger.get() == null);
loggers.forEach((logger) -> {
SpamReducedLogger l = logger.get();
if (l!=null) l.reset();
if (l != null)
l.reset();
});
}
private final int maxLogCount;
private final AtomicInteger logTries = new AtomicInteger(0);
public SpamReducedLogger(int maxLogPerSec) {
public SpamReducedLogger(int maxLogPerSec)
{
maxLogCount = maxLogPerSec;
loggers.add(new WeakReference<SpamReducedLogger>(this));
}
public void reset() {logTries.set(0);}
public boolean canMaybeLog() {return logTries.get() < maxLogCount;}
public void log(Level level, String str, Object... param) {
if (logTries.get() >= maxLogCount) return;
ApiShared.LOGGER.log(level.isLessSpecificThan(Level.INFO) ? Level.INFO : level, str, param);
public void reset()
{
logTries.set(0);
}
public void error(String str, Object... param) {
public boolean canMaybeLog()
{
return logTries.get() < maxLogCount;
}
public void log(Level level, String str, Object... param)
{
if (logTries.get() >= maxLogCount)
return;
LOGGER.log(level.isLessSpecificThan(Level.INFO) ? Level.INFO : level, str, param);
}
public void error(String str, Object... param)
{
log(Level.ERROR, str, param);
}
public void warn(String str, Object... param) {
public void warn(String str, Object... param)
{
log(Level.WARN, str, param);
}
public void info(String str, Object... param) {
public void info(String str, Object... param)
{
log(Level.INFO, str, param);
}
public void debug(String str, Object... param) {
public void debug(String str, Object... param)
{
log(Level.DEBUG, str, param);
}
public void trace(String str, Object... param) {
public void trace(String str, Object... param)
{
log(Level.TRACE, str, param);
}
public void incLogTries() {
public void incLogTries()
{
logTries.getAndIncrement();
}
public void logInc(Level level, String str, Object... param) {
if (logTries.getAndIncrement() >= maxLogCount) return;
ApiShared.LOGGER.log(level.isLessSpecificThan(Level.INFO) ? Level.INFO : level, str, param);
public void logInc(Level level, String str, Object... param)
{
if (logTries.getAndIncrement() >= maxLogCount)
return;
LOGGER.log(level.isLessSpecificThan(Level.INFO) ? Level.INFO : level, str, param);
}
public void errorInc(String str, Object... param) {
public void errorInc(String str, Object... param)
{
logInc(Level.ERROR, str, param);
}
public void warnInc(String str, Object... param) {
public void warnInc(String str, Object... param)
{
logInc(Level.WARN, str, param);
}
public void infoInc(String str, Object... param) {
public void infoInc(String str, Object... param)
{
logInc(Level.INFO, str, param);
}
public void debugInc(String str, Object... param) {
public void debugInc(String str, Object... param)
{
logInc(Level.DEBUG, str, param);
}
public void traceInc(String str, Object... param) {
public void traceInc(String str, Object... param)
{
logInc(Level.TRACE, str, param);
}
}
@@ -19,11 +19,14 @@
package com.seibel.lod.core.objects;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.util.LevelPosUtil;
import com.seibel.lod.core.util.LodUtil;
import org.apache.logging.log4j.Logger;
/**
* Holds a levelPos that needs to be rendered.
@@ -33,6 +36,8 @@ import com.seibel.lod.core.util.LodUtil;
*/
public class PosToRenderContainer
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public byte minDetail;
private int regionPosX;
private int regionPosZ;
@@ -60,7 +65,7 @@ public class PosToRenderContainer
{
// This is might be due to dimensions having a different width
// when first loading in
ApiShared.LOGGER.error("Unable to addPosToRender. numberOfPosToRender [" + numberOfPosToRender + "] detailLevel [" + detailLevel + "] Pos [" + posX + "," + posZ + "]");
LOGGER.error("Unable to addPosToRender. numberOfPosToRender [" + numberOfPosToRender + "] detailLevel [" + detailLevel + "] Pos [" + posX + "," + posZ + "]");
numberOfPosToRender++; // incrementing so we can see how many pos over the limit we would go
return;
}
@@ -19,14 +19,15 @@
package com.seibel.lod.core.objects.lod;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.api.internal.ClientApi;
import com.seibel.lod.core.enums.config.DistanceGenerationMode;
import com.seibel.lod.core.enums.config.DropoffQuality;
import com.seibel.lod.core.enums.config.GenerationPriority;
import com.seibel.lod.core.enums.config.VerticalQuality;
import com.seibel.lod.core.handlers.LodDimensionFileHandler;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.logging.SpamReducedLogger;
import com.seibel.lod.core.objects.Pos2D;
import com.seibel.lod.core.objects.PosToGenerateContainer;
@@ -35,8 +36,10 @@ import com.seibel.lod.core.util.gridList.MovableGridRingList;
import com.seibel.lod.core.wrapperInterfaces.config.ILodConfigWrapperSingleton;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import org.apache.logging.log4j.Logger;
import java.io.File;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -61,6 +64,7 @@ public class LodDimension
{
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public final IDimensionTypeWrapper dimension;
@@ -167,14 +171,14 @@ public class LodDimension
public synchronized void move(RegionPos regionOffset)
{
if (this.logEvents)
ApiShared.LOGGER.info("LodDim MOVE. Offset: "+regionOffset);
LOGGER.info("LodDim MOVE. Offset: "+regionOffset);
saveDirtyRegionsToFile(false); //async add dirty regions to be saved.
Pos2D p = regions.getCenter();
regions.move(p.x+regionOffset.x, p.y+regionOffset.z);
if (this.logEvents)
ApiShared.LOGGER.info("LodDim MOVE complete. Offset: "+regionOffset);
LOGGER.info("LodDim MOVE complete. Offset: "+regionOffset);
}
@@ -326,7 +330,7 @@ public class LodDimension
if (LodUtil.checkRamUsage(0.2, 128))
{
if (this.logEvents)
ApiShared.LOGGER.info("Enough ram for expandOrLoadThread. Restarting...");
LOGGER.info("Enough ram for expandOrLoadThread. Restarting...");
expandOrLoadPaused = false;
}
@@ -353,7 +357,7 @@ public class LodDimension
if (!LodUtil.checkRamUsage(0.2, 128))
{
if (this.logEvents)
ApiShared.LOGGER.warn("Not enough ram for expandOrLoadThread. Pausing until Ram is freed...");
LOGGER.warn("Not enough ram for expandOrLoadThread. Pausing until Ram is freed...");
// We have less than 10% or 64MB ram left. Don't expend.
expandOrLoadPaused = true;
@@ -388,7 +392,7 @@ public class LodDimension
{
if (this.logEvents)
{
ApiShared.LOGGER.error("MinDistance/MaxDistance is WRONG!!! minDist: [{}], maxDist: [{}], centerDist: [{}]\n"
LOGGER.error("MinDistance/MaxDistance is WRONG!!! minDist: [{}], maxDist: [{}], centerDist: [{}]\n"
+ "At center block pos: {} {}, region pos: {}",
minDistance, maxDistance, debugDistance, debugRPosX, debugRPosZ, regionPos);
}
@@ -698,7 +702,7 @@ public class LodDimension
if (r.isWriting.get() != 0) writingRegionCount++;
LevelContainer[] container = r.debugGetDataContainers().clone();
if (container == null || container.length != LodUtil.DETAIL_OPTIONS) {
ApiShared.LOGGER.warn("DumpRamUsage encountered an invalid region!");
LOGGER.warn("DumpRamUsage encountered an invalid region!");
continue;
}
for (int i = 0; i < LodUtil.DETAIL_OPTIONS; i++) {
@@ -743,11 +747,11 @@ public class LodDimension
boolean worked = cutAndExpandThread.awaitTermination(5, TimeUnit.SECONDS);
if (!worked)
ApiShared.LOGGER.error("Cut And Expend threads timed out! May cause crash on game exit due to cleanup failure.");
LOGGER.error("Cut And Expend threads timed out! May cause crash on game exit due to cleanup failure.");
}
catch (InterruptedException e)
{
ApiShared.LOGGER.error("Cut And Expend threads shutdown is interrupted! May cause crash on game exit due to cleanup failure: ", e);
LOGGER.error("Cut And Expend threads shutdown is interrupted! May cause crash on game exit due to cleanup failure: ", e);
}
}
@@ -19,11 +19,14 @@
package com.seibel.lod.core.objects.lod;
import java.lang.invoke.MethodHandles;
import java.util.Hashtable;
import java.util.Map;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.wrapperInterfaces.world.IDimensionTypeWrapper;
import org.apache.logging.log4j.Logger;
/**
* This stores all LODs for a given world.
@@ -33,6 +36,9 @@ import com.seibel.lod.core.wrapperInterfaces.world.IDimensionTypeWrapper;
*/
public class LodWorld
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
/** name of this world */
private String worldName;
@@ -64,7 +70,7 @@ public class LodWorld
*/
public void selectWorld(String newWorldName)
{
ApiShared.LOGGER.info("Selecting world {} while in world {}", newWorldName, worldName);
LOGGER.info("Selecting world {} while in world {}", newWorldName, worldName);
if (worldName.equals(newWorldName))
// don't recreate everything if we
// didn't actually change worlds
@@ -85,7 +91,7 @@ public class LodWorld
*/
public void deselectWorld()
{
ApiShared.LOGGER.info("Deselecting world {}", worldName);
LOGGER.info("Deselecting world {}", worldName);
worldName = NO_WORLD_LOADED;
saveAllDimensions(true); // Make sure all dims are saved. This will block threads
lodDimensions = null;
@@ -101,7 +107,7 @@ public class LodWorld
{
if (lodDimensions == null)
return;
ApiShared.LOGGER.info("Adding dim {} to world {}", newDimension, worldName);
LOGGER.info("Adding dim {} to world {}", newDimension, worldName);
LodDimension oldDim = lodDimensions.put(newDimension.dimension, newDimension);
if (oldDim != null)
@@ -144,7 +150,7 @@ public class LodWorld
// TODO we should only print this if lods were actually saved to file
// but that requires a LodDimension.hasDirtyRegions() method or something similar
ApiShared.LOGGER.info("Saving LODs");
LOGGER.info("Saving LODs");
for (IDimensionTypeWrapper key : lodDimensions.keySet())
{
@@ -19,17 +19,20 @@
package com.seibel.lod.core.objects.opengl;
import java.lang.invoke.MethodHandles;
import java.nio.ByteBuffer;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.api.internal.ClientApi;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.builders.lodBuilding.bufferBuilding.LodQuadBuilder;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.render.LodRenderer;
import com.seibel.lod.core.render.objects.GLVertexBuffer;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL32;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.builders.lodBuilding.bufferBuilding.LodBufferBuilderFactory;
import com.seibel.lod.core.enums.config.GpuUploadMethod;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler;
@@ -44,6 +47,7 @@ import static com.seibel.lod.core.render.GLProxy.GL_LOGGER;
public class SimpleRenderBuffer extends RenderBuffer
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
private static final long MAX_BUFFER_UPLOAD_TIMEOUT_NANOSECONDS = 1_000_000;
@@ -137,7 +141,7 @@ public class SimpleRenderBuffer extends RenderBuffer
} catch (Exception e) {
vbos[i-1] = null;
vbo.close();
ApiShared.LOGGER.error("Failed to upload buffer: ", e);
LOGGER.error("Failed to upload buffer: ", e);
}
if (BPerNS<=0) continue;
// upload buffers over an extended period of time
@@ -21,13 +21,15 @@ package com.seibel.lod.core.render;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.lang.invoke.MethodHandles;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.logging.ConfigBasedLogger;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.glfw.GLFW;
import org.lwjgl.opengl.GL;
import org.lwjgl.opengl.GL11;
@@ -66,12 +68,12 @@ public class GLProxy
{
public static final boolean OVERWIDE_VANILLA_GL_LOGGER = true;
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
private ExecutorService workerThread = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(GLProxy.class.getSimpleName() + "-Worker-Thread").build());
private static final ILodConfigWrapperSingleton CONFIG = SingletonHandler.get(ILodConfigWrapperSingleton.class);
private static final IMinecraftClientWrapper MC = SingletonHandler.get(IMinecraftClientWrapper.class);
private ExecutorService workerThread = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(GLProxy.class.getSimpleName() + "-Worker-Thread").build());
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public static final ConfigBasedLogger GL_LOGGER = new ConfigBasedLogger(LogManager.getLogger(GLProxy.class),
() -> CONFIG.client().advanced().debugging().debugSwitch().getLogRendererGLEvent());
@@ -463,18 +465,18 @@ public class GLProxy
public static void ensureAllGLJobCompleted() { // Uses global logger since it's a cleanup method
if (!hasInstance()) return;
ApiShared.LOGGER.info("Blocking until GL jobs finished...");
LOGGER.info("Blocking until GL jobs finished...");
try {
instance.workerThread.shutdown();
boolean worked = instance.workerThread.awaitTermination(30, TimeUnit.SECONDS);
if (!worked)
ApiShared.LOGGER.error("GLWorkerThread shutdown timed out! Game may crash on exit due to cleanup failure!");
LOGGER.error("GLWorkerThread shutdown timed out! Game may crash on exit due to cleanup failure!");
} catch (InterruptedException e) {
ApiShared.LOGGER.error("GLWorkerThread shutdown is interrupted! Game may crash on exit due to cleanup failure!");
LOGGER.error("GLWorkerThread shutdown is interrupted! Game may crash on exit due to cleanup failure!");
e.printStackTrace();
} finally {
instance.workerThread = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(GLProxy.class.getSimpleName() + "-Worker-Thread").build());
}
ApiShared.LOGGER.info("All GL jobs finished!");
LOGGER.info("All GL jobs finished!");
}
}
@@ -1,20 +1,27 @@
package com.seibel.lod.core.render.objects;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.enums.config.GpuUploadMethod;
import com.seibel.lod.core.enums.rendering.GLProxyContext;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.render.GLProxy;
import com.seibel.lod.core.util.UnitBytes;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL32;
import org.lwjgl.opengl.GL44;
import java.lang.invoke.MethodHandles;
import java.nio.ByteBuffer;
import java.util.concurrent.atomic.AtomicInteger;
public class GLBuffer implements AutoCloseable {
public class GLBuffer implements AutoCloseable
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public static final double BUFFER_EXPANSION_MULTIPLIER = 1.3;
public static final double BUFFER_SHRINK_TRIGGER = BUFFER_EXPANSION_MULTIPLIER * BUFFER_EXPANSION_MULTIPLIER;
public static AtomicInteger count = new AtomicInteger(0);
protected int id;
public final int getId() {
return id;
@@ -29,11 +36,13 @@ public class GLBuffer implements AutoCloseable {
}
protected boolean isMapped = false;
public GLBuffer(boolean isBufferStorage)
{
create(isBufferStorage);
}
// Should be override by subclasses
public int getBufferBindingTarget() {
return GL32.GL_COPY_READ_BUFFER;
@@ -68,7 +77,8 @@ public class GLBuffer implements AutoCloseable {
//firstCloseCallStack = Thread.currentThread().getStackTrace();
id = 0;
size = 0;
if (count.decrementAndGet()==0) ApiShared.LOGGER.info("All GLBuffer is freed.");
if (count.decrementAndGet()==0)
LOGGER.info("All GLBuffer is freed.");
}
}
@@ -1,15 +1,21 @@
package com.seibel.lod.core.render.objects;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.enums.config.GpuUploadMethod;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.render.GLProxy;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL32;
import java.lang.invoke.MethodHandles;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class QuadElementBuffer extends GLElementBuffer {
public class QuadElementBuffer extends GLElementBuffer
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public QuadElementBuffer() {
super(GLProxy.getInstance().bufferStorageSupported);
}
@@ -105,7 +111,7 @@ public class QuadElementBuffer extends GLElementBuffer {
} else {
type = GL32.GL_UNSIGNED_INT;
}
ApiShared.LOGGER.info("Quad IBO Resizing from [" + getCapacity() + "] to [" + quadCount + "]" + " with type: " +
LOGGER.info("Quad IBO Resizing from [" + getCapacity() + "] to [" + quadCount + "]" + " with type: " +
GLEnums.getString(type));
ByteBuffer buffer = ByteBuffer.allocateDirect(indicesCount * GLEnums.getTypeSize(type)).order(ByteOrder.nativeOrder());
@@ -19,13 +19,18 @@
package com.seibel.lod.core.util;
import com.seibel.lod.core.api.ApiShared;
import org.lwjgl.system.CallbackI;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import org.apache.logging.log4j.Logger;
import java.lang.invoke.MethodHandles;
import java.util.HashMap;
import java.util.function.Function;
public final class GLMessage {
public final class GLMessage
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
static final String HEADER = "[LWJGL] OpenGL debug message";
public final GLMessage.Type type;
public final GLMessage.Severity severity;
@@ -176,7 +181,7 @@ public final class GLMessage {
return msg;
}
} else if (!b) {
ApiShared.LOGGER.warn("Failed to parse GLMessage line '{}' at stage {}", str, stage);
LOGGER.warn("Failed to parse GLMessage line '{}' at stage {}", str, stage);
}
return null;
}
@@ -19,12 +19,14 @@
package com.seibel.lod.core.util;
import java.lang.invoke.MethodHandles;
import java.lang.ref.WeakReference;
import java.util.LinkedList;
import java.util.concurrent.ThreadFactory;
import com.seibel.lod.core.api.ApiShared;
import com.seibel.lod.core.api.ClientApi;
import com.seibel.lod.core.api.internal.InternalApiShared;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import org.apache.logging.log4j.Logger;
/**
* Just a simple ThreadFactory to name ExecutorService
@@ -34,6 +36,8 @@ import com.seibel.lod.core.api.ClientApi;
*/
public class LodThreadFactory implements ThreadFactory
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public final String threadName;
public final int priority;
private int threadCount = 0;
@@ -74,7 +78,7 @@ public class LodThreadFactory implements ThreadFactory
if (t != null) {
StackTraceElement[] stacks = t.getStackTrace();
if (stacks.length != 0) {
ApiShared.LOGGER.info("===========================================\n"
LOGGER.info("===========================================\n"
+ "Thread: "+t.getName()+"\n"+StackTraceToString(stacks));
}
}