Remove monitored read/write locks, use basic version

This commit is contained in:
P0nk
2022-08-11 14:16:06 +02:00
parent 8ab2058ecc
commit 8657b765b1
11 changed files with 93 additions and 168 deletions

View File

@@ -21,13 +21,6 @@ package client;
import config.YamlConfig;
import constants.game.GameConstants;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import server.maps.AbstractAnimatedMapObject;
import server.maps.MapleMap;
@@ -35,6 +28,9 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author RonanLana
@@ -50,14 +46,14 @@ public abstract class AbstractCharacterObject extends AbstractAnimatedMapObject
private AbstractCharacterListener listener = null;
protected Map<Stat, Integer> statUpdates = new HashMap<>();
protected Lock effLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHARACTER_EFF, true);
protected MonitoredReadLock statRlock;
protected MonitoredWriteLock statWlock;
protected final Lock effLock = new ReentrantLock(true);
protected final Lock statRlock;
protected final Lock statWlock;
protected AbstractCharacterObject() {
MonitoredReentrantReadWriteLock locks = new MonitoredReentrantReadWriteLock(MonitoredLockType.CHARACTER_STA, true);
statRlock = MonitoredReadLockFactory.createLock(locks);
statWlock = MonitoredWriteLockFactory.createLock(locks);
ReadWriteLock statLock = new ReentrantReadWriteLock(true);
this.statRlock = statLock.readLock();
this.statWlock = statLock.writeLock();
for (int i = 0; i < remainingSp.length; i++) {
remainingSp[i] = 0;

View File

@@ -23,21 +23,23 @@ package net.server;
import client.Character;
import client.Client;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class PlayerStorage {
private final MonitoredReentrantReadWriteLock locks = new MonitoredReentrantReadWriteLock(MonitoredLockType.PLAYER_STORAGE, true);
private final Map<Integer, Character> storage = new LinkedHashMap<>();
private final Map<String, Character> nameStorage = new LinkedHashMap<>();
private final MonitoredReadLock rlock = MonitoredReadLockFactory.createLock(locks);
private final MonitoredWriteLock wlock = MonitoredWriteLockFactory.createLock(locks);
private final Lock rlock;
private final Lock wlock;
public PlayerStorage() {
ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
this.rlock = readWriteLock.readLock();
this.wlock = readWriteLock.writeLock();
}
public void addPlayer(Character chr) {
wlock.lock();

View File

@@ -1,32 +0,0 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2019 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.server.audit.locks.factory;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.active.TrackerReadLock;
/**
* @author RonanLana
*/
public class MonitoredReadLockFactory {
public static TrackerReadLock createLock(MonitoredReentrantReadWriteLock lock) {
return new TrackerReadLock(lock);
}
}

View File

@@ -1,32 +0,0 @@
/*
This file is part of the HeavenMS MapleStory Server
Copyleft (L) 2016 - 2019 RonanLana
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation version 3 as published by
the Free Software Foundation. You may not use, modify or distribute
this program under any other version of the GNU Affero General Public
License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.server.audit.locks.factory;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.active.TrackerWriteLock;
/**
* @author RonanLana
*/
public class MonitoredWriteLockFactory {
public static TrackerWriteLock createLock(MonitoredReentrantReadWriteLock lock) {
return new TrackerWriteLock(lock);
}
}

View File

@@ -23,12 +23,6 @@ import client.Character;
import client.Job;
import config.YamlConfig;
import constants.id.MapId;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import net.server.coordinator.world.InviteCoordinator;
import net.server.coordinator.world.InviteCoordinator.InviteType;
import net.server.world.Party;
@@ -41,6 +35,9 @@ import tools.Pair;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Ronan
@@ -51,9 +48,8 @@ public class PartySearchCoordinator {
private final Map<Job, PartySearchEchelon> upcomers = new HashMap<>();
private final List<Character> leaderQueue = new LinkedList<>();
private final MonitoredReentrantReadWriteLock leaderQueueLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_PARTY_SEARCH_QUEUE, true);
private final MonitoredReadLock leaderQueueRLock = MonitoredReadLockFactory.createLock(leaderQueueLock);
private final MonitoredWriteLock leaderQueueWLock = MonitoredWriteLockFactory.createLock(leaderQueueLock);
private final Lock leaderQueueRLock;
private final Lock leaderQueueWLock;
private final Map<Integer, Character> searchLeaders = new HashMap<>();
private final Map<Integer, LeaderSearchMetadata> searchSettings = new HashMap<>();
@@ -65,6 +61,17 @@ public class PartySearchCoordinator {
private static final Map<Integer, Set<Integer>> mapNeighbors = fetchNeighbouringMaps();
private static final Map<Integer, Job> jobTable = instantiateJobTable();
public PartySearchCoordinator() {
for (Job job : jobTable.values()) {
storage.put(job, new PartySearchStorage());
upcomers.put(job, new PartySearchEchelon());
}
ReadWriteLock leaderQueueLock = new ReentrantReadWriteLock(true);
this.leaderQueueRLock = leaderQueueLock.readLock();
this.leaderQueueWLock = leaderQueueLock.writeLock();
}
private static Map<Integer, Set<Integer>> fetchNeighbouringMaps() {
Map<Integer, Set<Integer>> mapLinks = new HashMap<>();
@@ -176,13 +183,6 @@ public class PartySearchCoordinator {
}
public PartySearchCoordinator() {
for (Job job : jobTable.values()) {
storage.put(job, new PartySearchStorage());
upcomers.put(job, new PartySearchEchelon());
}
}
public void attachPlayer(Character chr) {
upcomers.get(getPartySearchJob(chr.getJob())).attachPlayer(chr);
}

View File

@@ -20,30 +20,31 @@
package net.server.coordinator.partysearch;
import client.Character;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Ronan
*/
public class PartySearchEchelon {
private final MonitoredReentrantReadWriteLock psLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_PARTY_SEARCH_ECHELON, true);
private final MonitoredReadLock psRLock = MonitoredReadLockFactory.createLock(psLock);
private final MonitoredWriteLock psWLock = MonitoredWriteLockFactory.createLock(psLock);
private final Lock psRLock;
private final Lock psWLock;
private final Map<Integer, WeakReference<Character>> echelon = new HashMap<>(20);
public PartySearchEchelon() {
ReadWriteLock partySearchLock = new ReentrantReadWriteLock(true);
this.psRLock = partySearchLock.readLock();
this.psWLock = partySearchLock.writeLock();
}
public List<Character> exportEchelon() {
psWLock.lock(); // reversing read/write actually could provide a lax yet sure performance/precision trade-off here
try {

View File

@@ -20,15 +20,12 @@
package net.server.coordinator.partysearch;
import client.Character;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import tools.IntervalBuilder;
import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Ronan
@@ -38,9 +35,14 @@ public class PartySearchStorage {
private final List<PartySearchCharacter> storage = new ArrayList<>(20);
private final IntervalBuilder emptyIntervals = new IntervalBuilder();
private final MonitoredReentrantReadWriteLock psLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_PARTY_SEARCH_STORAGE, true);
private final MonitoredReadLock psRLock = MonitoredReadLockFactory.createLock(psLock);
private final MonitoredWriteLock psWLock = MonitoredWriteLockFactory.createLock(psLock);
private final Lock psRLock;
private final Lock psWLock;
public PartySearchStorage() {
ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
this.psRLock = readWriteLock.readLock();
this.psWLock = readWriteLock.writeLock();
}
public List<PartySearchCharacter> getStorageList() {
psRLock.lock();

View File

@@ -21,12 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package server.life;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import provider.Data;
import provider.DataProvider;
import provider.DataProviderFactory;
@@ -38,6 +32,9 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import static java.util.concurrent.TimeUnit.SECONDS;
@@ -49,22 +46,22 @@ public class MobSkillFactory {
private static final Map<String, MobSkill> mobSkills = new HashMap<>();
private final static DataProvider dataSource = DataProviderFactory.getDataProvider(WZFiles.SKILL);
private static final Data skillRoot = dataSource.getData("MobSkill.img");
private final static MonitoredReentrantReadWriteLock dataLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MOBSKILL_FACTORY);
private final static MonitoredReadLock rL = MonitoredReadLockFactory.createLock(dataLock);
private final static MonitoredWriteLock wL = MonitoredWriteLockFactory.createLock(dataLock);
private final static ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final static Lock readLock = readWriteLock.readLock();
private final static Lock writeLock = readWriteLock.writeLock();
public static MobSkill getMobSkill(final int skillId, final int level) {
final String key = skillId + "" + level;
rL.lock();
readLock.lock();
try {
MobSkill ret = mobSkills.get(key);
if (ret != null) {
return ret;
}
} finally {
rL.unlock();
readLock.unlock();
}
wL.lock();
writeLock.lock();
try {
MobSkill ret;
ret = mobSkills.get(key);
@@ -114,7 +111,7 @@ public class MobSkillFactory {
}
return ret;
} finally {
wL.unlock();
writeLock.unlock();
}
}
}

View File

@@ -22,16 +22,13 @@ package server.maps;
import client.Character;
import client.Client;
import constants.id.MapId;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import net.server.world.Party;
import tools.PacketCreator;
import java.awt.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Ronan
@@ -45,9 +42,8 @@ public class DoorObject extends AbstractMapObject {
private int linkedPortalId;
private Point linkedPos;
private final MonitoredReentrantReadWriteLock locks = new MonitoredReentrantReadWriteLock(MonitoredLockType.PLAYER_DOOR, true);
private final MonitoredReadLock rlock = MonitoredReadLockFactory.createLock(locks);
private final MonitoredWriteLock wlock = MonitoredWriteLockFactory.createLock(locks);
private final Lock rlock;
private final Lock wlock;
public DoorObject(int owner, MapleMap destination, MapleMap origin, int townPortalId, Point targetPosition, Point toPosition) {
super();
@@ -58,6 +54,10 @@ public class DoorObject extends AbstractMapObject {
from = origin;
to = destination;
linkedPos = toPosition;
ReadWriteLock lock = new ReentrantReadWriteLock(true);
this.rlock = lock.readLock();
this.wlock = lock.writeLock();
}
public void update(int townPortalId, Point toPosition) {

View File

@@ -19,16 +19,13 @@
*/
package server.maps;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import scripting.event.EventInstanceManager;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MapManager {
private final int channel;
@@ -37,17 +34,17 @@ public class MapManager {
private final Map<Integer, MapleMap> maps = new HashMap<>();
private final MonitoredReadLock mapsRLock;
private final MonitoredWriteLock mapsWLock;
private final Lock mapsRLock;
private final Lock mapsWLock;
public MapManager(EventInstanceManager eim, int world, int channel) {
this.world = world;
this.channel = channel;
this.event = eim;
MonitoredReentrantReadWriteLock rrwl = new MonitoredReentrantReadWriteLock(MonitoredLockType.MAP_MANAGER);
this.mapsRLock = MonitoredReadLockFactory.createLock(rrwl);
this.mapsWLock = MonitoredWriteLockFactory.createLock(rrwl);
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
this.mapsRLock = readWriteLock.readLock();
this.mapsWLock = readWriteLock.writeLock();
}
public MapleMap resetMap(int mapid) {

View File

@@ -19,31 +19,25 @@
*/
package tools;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReadLock;
import net.server.audit.locks.MonitoredReentrantReadWriteLock;
import net.server.audit.locks.MonitoredWriteLock;
import net.server.audit.locks.factory.MonitoredReadLockFactory;
import net.server.audit.locks.factory.MonitoredWriteLockFactory;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Ronan
*/
public class IntervalBuilder {
private final List<Line2D> intervalLimits = new ArrayList<>();
protected MonitoredReadLock intervalRlock;
protected MonitoredWriteLock intervalWlock;
private final Lock intervalRlock;
private final Lock intervalWlock;
public IntervalBuilder() {
MonitoredReentrantReadWriteLock locks = new MonitoredReentrantReadWriteLock(MonitoredLockType.INTERVAL, true);
intervalRlock = MonitoredReadLockFactory.createLock(locks);
intervalWlock = MonitoredWriteLockFactory.createLock(locks);
ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
this.intervalRlock = readWriteLock.readLock();
this.intervalWlock = readWriteLock.writeLock();
}
private void refitOverlappedIntervals(int st, int en, int newFrom, int newTo) {