9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-30 04:29:05 +00:00

ATOMIC MAYHEM

This commit is contained in:
Daniel Mills
2020-08-03 10:44:34 -04:00
parent b6592582b3
commit 58a5aaed30
17 changed files with 424 additions and 476 deletions

View 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;
}
}

View File

@@ -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();
}

View File

@@ -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()

View File

@@ -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();
}