mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-30 04:29:05 +00:00
ATOMIC MAYHEM
This commit is contained in:
77
src/main/java/com/volmit/iris/gen/atomics/AtomicCache.java
Normal file
77
src/main/java/com/volmit/iris/gen/atomics/AtomicCache.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package com.volmit.iris.gen.atomics;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.volmit.iris.util.IrisLock;
|
||||
import com.volmit.iris.util.M;
|
||||
|
||||
public class AtomicCache<T>
|
||||
{
|
||||
private transient volatile T t;
|
||||
private transient volatile long a;
|
||||
private transient volatile int validations;
|
||||
private final IrisLock check;
|
||||
private final IrisLock time;
|
||||
private final IrisLock write;
|
||||
|
||||
public AtomicCache()
|
||||
{
|
||||
check = new IrisLock("Check");
|
||||
write = new IrisLock("Write");
|
||||
time = new IrisLock("Time");
|
||||
validations = 0;
|
||||
a = -1;
|
||||
t = null;
|
||||
}
|
||||
|
||||
public void reset()
|
||||
{
|
||||
check.lock();
|
||||
write.lock();
|
||||
time.lock();
|
||||
a = -1;
|
||||
t = null;
|
||||
time.unlock();
|
||||
write.unlock();
|
||||
check.unlock();
|
||||
}
|
||||
|
||||
public T aquire(Supplier<T> t)
|
||||
{
|
||||
if(this.t != null && validations > 1000)
|
||||
{
|
||||
return this.t;
|
||||
}
|
||||
|
||||
if(this.t != null && M.ms() - a > 1000)
|
||||
{
|
||||
if(this.t != null)
|
||||
{
|
||||
validations++;
|
||||
}
|
||||
|
||||
return this.t;
|
||||
}
|
||||
|
||||
check.lock();
|
||||
|
||||
if(this.t == null)
|
||||
{
|
||||
write.lock();
|
||||
this.t = t.get();
|
||||
|
||||
time.lock();
|
||||
|
||||
if(a == -1)
|
||||
{
|
||||
a = M.ms();
|
||||
}
|
||||
|
||||
time.unlock();
|
||||
write.unlock();
|
||||
}
|
||||
|
||||
check.unlock();
|
||||
return this.t;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package com.volmit.iris.gen.atomics;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Biome;
|
||||
@@ -14,6 +13,7 @@ import org.bukkit.generator.ChunkGenerator.ChunkData;
|
||||
import com.volmit.iris.object.IrisBiome;
|
||||
import com.volmit.iris.util.BlockDataTools;
|
||||
import com.volmit.iris.util.HeightMap;
|
||||
import com.volmit.iris.util.IrisLock;
|
||||
import com.volmit.iris.util.KList;
|
||||
import com.volmit.iris.util.KMap;
|
||||
import com.volmit.iris.util.M;
|
||||
@@ -27,7 +27,7 @@ public class AtomicSliver
|
||||
private KMap<Integer, BlockData> block;
|
||||
private KMap<Integer, IrisBiome> truebiome;
|
||||
private KMap<Integer, Biome> biome;
|
||||
private ReentrantLock lock = new ReentrantLock();
|
||||
private IrisLock lock = new IrisLock("Sliver");
|
||||
private int highestBlock = 0;
|
||||
private int highestBiome = 0;
|
||||
private long last = M.ms();
|
||||
@@ -37,6 +37,7 @@ public class AtomicSliver
|
||||
|
||||
public AtomicSliver(int x, int z)
|
||||
{
|
||||
lock.setDisabled(true);
|
||||
this.x = x;
|
||||
this.z = z;
|
||||
this.block = new KMap<>();
|
||||
@@ -71,14 +72,15 @@ public class AtomicSliver
|
||||
|
||||
lock.lock();
|
||||
block.put(h, d);
|
||||
lock.unlock();
|
||||
modified = true;
|
||||
|
||||
if(d.getMaterial().equals(Material.AIR) || d.getMaterial().equals(Material.CAVE_AIR))
|
||||
{
|
||||
lock.unlock();
|
||||
return;
|
||||
}
|
||||
|
||||
lock.lock();
|
||||
highestBlock = h > highestBlock ? h : highestBlock;
|
||||
lock.unlock();
|
||||
}
|
||||
@@ -167,7 +169,7 @@ public class AtomicSliver
|
||||
height.setHeight(x, z, highestBlock);
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
public void read(DataInputStream din) throws IOException
|
||||
{
|
||||
lock.lock();
|
||||
@@ -176,12 +178,12 @@ public class AtomicSliver
|
||||
int p = din.readByte() - Byte.MIN_VALUE;
|
||||
KList<BlockData> palette = new KList<BlockData>();
|
||||
highestBlock = h;
|
||||
|
||||
|
||||
for(int i = 0; i < p; i++)
|
||||
{
|
||||
palette.add(BlockDataTools.getBlockData(din.readUTF()));
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i <= h; i++)
|
||||
{
|
||||
block.put(i, palette.get(din.readByte() - Byte.MIN_VALUE).clone());
|
||||
@@ -189,38 +191,38 @@ public class AtomicSliver
|
||||
modified = false;
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
public void write(DataOutputStream dos) throws IOException
|
||||
{
|
||||
lock.lock();
|
||||
dos.writeByte(highestBlock + Byte.MIN_VALUE);
|
||||
KList<String> palette = new KList<>();
|
||||
|
||||
|
||||
for(int i = 0; i <= highestBlock; i++)
|
||||
{
|
||||
BlockData dat = block.get(i);
|
||||
String d = (dat == null ? AIR : dat).getAsString(true);
|
||||
|
||||
|
||||
if(!palette.contains(d))
|
||||
{
|
||||
palette.add(d);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
dos.writeByte(palette.size() + Byte.MIN_VALUE);
|
||||
|
||||
|
||||
for(String i : palette)
|
||||
{
|
||||
dos.writeUTF(i);
|
||||
}
|
||||
|
||||
|
||||
for(int i = 0; i <= highestBlock; i++)
|
||||
{
|
||||
BlockData dat = block.get(i);
|
||||
String d = (dat == null ? AIR : dat).getAsString(true);
|
||||
dos.writeByte(palette.indexOf(d) + Byte.MIN_VALUE);
|
||||
}
|
||||
|
||||
|
||||
lock.unlock();
|
||||
}
|
||||
|
||||
|
||||
@@ -338,7 +338,7 @@ public class AtomicWorldData
|
||||
|
||||
private int getUnloadBatchSize()
|
||||
{
|
||||
return Math.max(3, getLoadedRegions().size() / 125);
|
||||
return Math.max(3, getLoadedRegions().size() / 85);
|
||||
}
|
||||
|
||||
private int getUnloadBatchSpeed()
|
||||
|
||||
@@ -1,18 +1,17 @@
|
||||
package com.volmit.iris.gen.atomics;
|
||||
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import com.volmit.iris.util.IrisLock;
|
||||
import com.volmit.iris.util.KMap;
|
||||
|
||||
public class MasterLock
|
||||
{
|
||||
private KMap<String, ReentrantLock> locks;
|
||||
private ReentrantLock lock;
|
||||
private KMap<String, IrisLock> locks;
|
||||
private IrisLock lock;
|
||||
|
||||
public MasterLock()
|
||||
{
|
||||
locks = new KMap<>();
|
||||
lock = new ReentrantLock();
|
||||
lock = new IrisLock("MasterLock");
|
||||
}
|
||||
|
||||
public void clear()
|
||||
@@ -25,10 +24,10 @@ public class MasterLock
|
||||
lock.lock();
|
||||
if(!locks.containsKey(key))
|
||||
{
|
||||
locks.put(key, new ReentrantLock());
|
||||
locks.put(key, new IrisLock("Locker"));
|
||||
}
|
||||
|
||||
ReentrantLock l = locks.get(key);
|
||||
IrisLock l = locks.get(key);
|
||||
lock.unlock();
|
||||
l.lock();
|
||||
}
|
||||
@@ -38,10 +37,10 @@ public class MasterLock
|
||||
lock.lock();
|
||||
if(!locks.containsKey(key))
|
||||
{
|
||||
locks.put(key, new ReentrantLock());
|
||||
locks.put(key, new IrisLock("Unlocker"));
|
||||
}
|
||||
|
||||
ReentrantLock l = locks.get(key);
|
||||
IrisLock l = locks.get(key);
|
||||
lock.unlock();
|
||||
l.unlock();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user