summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKHobbits <rob@khobbits.co.uk>2014-06-16 19:55:34 +0100
committerKHobbits <rob@khobbits.co.uk>2014-06-16 19:55:34 +0100
commit7c013fa437252147a8c20f8eab07e4a0db8a3cc5 (patch)
tree3fb6fee4a4ca837d1d8c66149998c14958469a39
parent32c61c2e915e66516ec374db2c3caf9c27ddf51e (diff)
downloadEssentials-7c013fa437252147a8c20f8eab07e4a0db8a3cc5.tar
Essentials-7c013fa437252147a8c20f8eab07e4a0db8a3cc5.tar.gz
Essentials-7c013fa437252147a8c20f8eab07e4a0db8a3cc5.tar.lz
Essentials-7c013fa437252147a8c20f8eab07e4a0db8a3cc5.tar.xz
Essentials-7c013fa437252147a8c20f8eab07e4a0db8a3cc5.zip
Add spawn location cache to reduce blocking on player respawn.
-rw-r--r--EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java61
1 files changed, 44 insertions, 17 deletions
diff --git a/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java b/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java
index 36b6f9662..c8e12563c 100644
--- a/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java
+++ b/EssentialsSpawn/src/com/earth2me/essentials/spawn/SpawnStorage.java
@@ -8,12 +8,16 @@ import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import org.bukkit.Location;
import org.bukkit.World;
public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IEssentialsModule
{
+ private ConcurrentMap<String, Location> spawns;
+
public SpawnStorage(final IEssentials ess)
{
super(ess, Spawns.class);
@@ -21,6 +25,13 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
}
@Override
+ public final void reloadConfig()
+ {
+ super.reloadConfig();
+ spawns = new ConcurrentHashMap<String, Location>();
+ }
+
+ @Override
public File getStorageFile()
{
return new File(ess.getDataFolder(), "spawn.yml");
@@ -52,6 +63,8 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
unlock();
}
+ spawns.clear();
+
if ("default".equalsIgnoreCase(group))
{
loc.getWorld().setSpawnLocation(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
@@ -60,29 +73,43 @@ public class SpawnStorage extends AsyncStorageObjectHolder<Spawns> implements IE
public Location getSpawn(final String group)
{
- acquireReadLock();
- try
+ Location spawnLocation;
+ if (spawns.containsKey(group))
{
- if (getData().getSpawns() == null || group == null)
- {
- return getWorldSpawn();
- }
- final Map<String, Location> spawnMap = getData().getSpawns();
- String groupName = group.toLowerCase(Locale.ENGLISH);
- if (!spawnMap.containsKey(groupName))
+ spawnLocation = spawns.get(group);
+ }
+ else
+ {
+ acquireReadLock();
+ try
{
- groupName = "default";
+ if (getData().getSpawns() == null || group == null)
+ {
+ return getWorldSpawn();
+ }
+ final Map<String, Location> spawnMap = getData().getSpawns();
+ String groupName = group.toLowerCase(Locale.ENGLISH);
+ if (!spawnMap.containsKey(groupName))
+ {
+ groupName = "default";
+ }
+ if (!spawnMap.containsKey(groupName))
+ {
+ spawnLocation = getWorldSpawn();
+ }
+ else
+ {
+ spawnLocation = spawnMap.get(groupName);
+ }
}
- if (!spawnMap.containsKey(groupName))
+ finally
{
- return getWorldSpawn();
+ unlock();
}
- return spawnMap.get(groupName);
- }
- finally
- {
- unlock();
+
+ spawns.put(group, spawnLocation);
}
+ return spawnLocation;
}
private Location getWorldSpawn()