mirror of
https://github.com/webbukkit/dynmap.git
synced 2025-02-26 00:31:44 +01:00
Add r/w lock around marker file operations and commands
This commit is contained in:
parent
e7113dc163
commit
648e11bb53
@ -46,11 +46,13 @@ import org.dynmap.markers.PlayerSet;
|
||||
import org.dynmap.markers.PolyLineMarker;
|
||||
import org.dynmap.utils.BufferOutputStream;
|
||||
import org.dynmap.web.Json;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
/**
|
||||
* Implementation class for MarkerAPI - should not be called directly
|
||||
*/
|
||||
public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
||||
private File markerpersist;
|
||||
private File markerpersist_old;
|
||||
private File markerdir; /* Local store for markers (internal) */
|
||||
@ -336,6 +338,8 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
public void run() {
|
||||
if(stop)
|
||||
return;
|
||||
lock.readLock().lock();
|
||||
try {
|
||||
/* Write markers first - drives JSON updates too */
|
||||
if(dirty_markers) {
|
||||
doSaveMarkers();
|
||||
@ -348,6 +352,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
}
|
||||
dirty_worlds.clear();
|
||||
}
|
||||
} finally {
|
||||
lock.readLock().unlock();
|
||||
}
|
||||
core.getServer().scheduleServerTask(this, 20);
|
||||
}
|
||||
}
|
||||
@ -412,17 +419,26 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
plugin.events.removeListener("worldactivated", api);
|
||||
|
||||
stop = true;
|
||||
lock.readLock().lock();
|
||||
try {
|
||||
if(dirty_markers) {
|
||||
doSaveMarkers();
|
||||
dirty_markers = false;
|
||||
}
|
||||
|
||||
} finally {
|
||||
lock.readLock().unlock();
|
||||
}
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
for(MarkerIconImpl icn : markericons.values())
|
||||
icn.cleanup();
|
||||
markericons.clear();
|
||||
for(MarkerSetImpl set : markersets.values())
|
||||
set.cleanup();
|
||||
markersets.clear();
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private MarkerIcon createBuiltinMarkerIcon(String id, String label) {
|
||||
@ -668,8 +684,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
private boolean loadMarkers() {
|
||||
ConfigurationNode conf = new ConfigurationNode(api.markerpersist); /* Make configuration object */
|
||||
conf.load(); /* Load persistence */
|
||||
lock.writeLock().lock();
|
||||
try {
|
||||
/* Get icons */
|
||||
|
||||
ConfigurationNode icons = conf.getNode("icons");
|
||||
if(icons == null) return false;
|
||||
for(String id : icons.keySet()) {
|
||||
@ -698,6 +715,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
lock.writeLock().unlock();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -1104,7 +1124,43 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
if (!commands.contains(c)) {
|
||||
return false;
|
||||
}
|
||||
/* Process commands */
|
||||
/* Process commands read commands */
|
||||
api.lock.readLock().lock();
|
||||
try {
|
||||
/* List markers */
|
||||
if(c.equals("list") && plugin.checkPlayerPermission(sender, "marker.list")) {
|
||||
return processListMarker(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List icons */
|
||||
else if(c.equals("icons") && plugin.checkPlayerPermission(sender, "marker.icons")) {
|
||||
return processListIcon(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List sets */
|
||||
else if(c.equals("listsets") && plugin.checkPlayerPermission(sender, "marker.listsets")) {
|
||||
return processListSet(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List areas */
|
||||
else if(c.equals("listareas") && plugin.checkPlayerPermission(sender, "marker.listareas")) {
|
||||
return processListArea(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List poly-lines */
|
||||
else if(c.equals("listlines") && plugin.checkPlayerPermission(sender, "marker.listlines")) {
|
||||
return processListLine(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List circles */
|
||||
else if(c.equals("listcircles") && plugin.checkPlayerPermission(sender, "marker.listcircles")) {
|
||||
return processListCircle(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Get label for given item - must have ID and type parameter */
|
||||
else if(c.equals("getlabel") && plugin.checkPlayerPermission(sender, "marker.getlabel")) {
|
||||
return processGetLabel(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
} finally {
|
||||
api.lock.readLock().unlock();
|
||||
}
|
||||
// Handle modify commands
|
||||
api.lock.writeLock().lock();
|
||||
try {
|
||||
if(c.equals("add") && api.core.checkPlayerPermission(sender, "marker.add")) {
|
||||
return processAddMarker(plugin, sender, cmd, commandLabel, args, player);
|
||||
}
|
||||
@ -1120,14 +1176,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("delete") && plugin.checkPlayerPermission(sender, "marker.delete")) {
|
||||
return processDeleteMarker(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List markers */
|
||||
else if(c.equals("list") && plugin.checkPlayerPermission(sender, "marker.list")) {
|
||||
return processListMarker(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List icons */
|
||||
else if(c.equals("icons") && plugin.checkPlayerPermission(sender, "marker.icons")) {
|
||||
return processListIcon(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
else if(c.equals("addset") && plugin.checkPlayerPermission(sender, "marker.addset")) {
|
||||
return processAddSet(plugin, sender, cmd, commandLabel, args, player);
|
||||
}
|
||||
@ -1137,10 +1185,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("deleteset") && plugin.checkPlayerPermission(sender, "marker.deleteset")) {
|
||||
return processDeleteSet(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* List sets */
|
||||
else if(c.equals("listsets") && plugin.checkPlayerPermission(sender, "marker.listsets")) {
|
||||
return processListSet(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Add new icon */
|
||||
else if(c.equals("addicon") && plugin.checkPlayerPermission(sender, "marker.addicon")) {
|
||||
return processAddIcon(plugin, sender, cmd, commandLabel, args);
|
||||
@ -1161,10 +1205,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("addarea") && plugin.checkPlayerPermission(sender, "marker.addarea")) {
|
||||
return processAddArea(plugin, sender, cmd, commandLabel, args, player);
|
||||
}
|
||||
/* List areas */
|
||||
else if(c.equals("listareas") && plugin.checkPlayerPermission(sender, "marker.listareas")) {
|
||||
return processListArea(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Delete area - must have ID parameter */
|
||||
else if(c.equals("deletearea") && plugin.checkPlayerPermission(sender, "marker.deletearea")) {
|
||||
return processDeleteArea(plugin, sender, cmd, commandLabel, args);
|
||||
@ -1176,10 +1216,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("addline") && plugin.checkPlayerPermission(sender, "marker.addline")) {
|
||||
return processAddLine(plugin, sender, cmd, commandLabel, args, player);
|
||||
}
|
||||
/* List poly-lines */
|
||||
else if(c.equals("listlines") && plugin.checkPlayerPermission(sender, "marker.listlines")) {
|
||||
return processListLine(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Delete poly-line - must have ID parameter */
|
||||
else if(c.equals("deleteline") && plugin.checkPlayerPermission(sender, "marker.deleteline")) {
|
||||
return processDeleteLine(plugin, sender, cmd, commandLabel, args);
|
||||
@ -1191,10 +1227,6 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("addcircle") && plugin.checkPlayerPermission(sender, "marker.addcircle")) {
|
||||
return processAddCircle(plugin, sender, cmd, commandLabel, args, player);
|
||||
}
|
||||
/* List circles */
|
||||
else if(c.equals("listcircles") && plugin.checkPlayerPermission(sender, "marker.listcircles")) {
|
||||
return processListCircle(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Delete circle - must have ID parameter */
|
||||
else if(c.equals("deletecircle") && plugin.checkPlayerPermission(sender, "marker.deletecircle")) {
|
||||
return processDeleteCircle(plugin, sender, cmd, commandLabel, args);
|
||||
@ -1223,13 +1255,12 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
||||
else if(c.equals("importlabel") && plugin.checkPlayerPermission(sender, "marker.importlabel")) {
|
||||
return processImportLabel(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
/* Get label for given item - must have ID and type parameter */
|
||||
else if(c.equals("getlabel") && plugin.checkPlayerPermission(sender, "marker.getlabel")) {
|
||||
return processGetLabel(plugin, sender, cmd, commandLabel, args);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
api.lock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean processAddMarker(DynmapCore plugin, DynmapCommandSender sender, String cmd, String commandLabel, String[] args, DynmapPlayer player) {
|
||||
|
Loading…
Reference in New Issue
Block a user