From 8657b765b17b505edc6304739de335fb9292e77e Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 11 Aug 2022 14:16:06 +0200 Subject: [PATCH] Remove monitored read/write locks, use basic version --- .../java/client/AbstractCharacterObject.java | 22 ++++++------- src/main/java/net/server/PlayerStorage.java | 20 ++++++------ .../factory/MonitoredReadLockFactory.java | 32 ------------------- .../factory/MonitoredWriteLockFactory.java | 32 ------------------- .../partysearch/PartySearchCoordinator.java | 32 +++++++++---------- .../partysearch/PartySearchEchelon.java | 21 ++++++------ .../partysearch/PartySearchStorage.java | 20 ++++++------ .../java/server/life/MobSkillFactory.java | 23 ++++++------- src/main/java/server/maps/DoorObject.java | 18 +++++------ src/main/java/server/maps/MapManager.java | 19 +++++------ src/main/java/tools/IntervalBuilder.java | 22 +++++-------- 11 files changed, 93 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java delete mode 100644 src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java diff --git a/src/main/java/client/AbstractCharacterObject.java b/src/main/java/client/AbstractCharacterObject.java index d7dc91400d..e178ac1f43 100644 --- a/src/main/java/client/AbstractCharacterObject.java +++ b/src/main/java/client/AbstractCharacterObject.java @@ -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 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; diff --git a/src/main/java/net/server/PlayerStorage.java b/src/main/java/net/server/PlayerStorage.java index 8fa6b4e472..fd406cadbb 100644 --- a/src/main/java/net/server/PlayerStorage.java +++ b/src/main/java/net/server/PlayerStorage.java @@ -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 storage = new LinkedHashMap<>(); private final Map 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(); diff --git a/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java b/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java deleted file mode 100644 index ae50172c62..0000000000 --- a/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java +++ /dev/null @@ -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 . -*/ -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); - } -} diff --git a/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java b/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java deleted file mode 100644 index 2445d0bfe2..0000000000 --- a/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java +++ /dev/null @@ -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 . -*/ -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); - } -} diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchCoordinator.java b/src/main/java/net/server/coordinator/partysearch/PartySearchCoordinator.java index e93e99fd93..fbaba5e7e9 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchCoordinator.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchCoordinator.java @@ -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 upcomers = new HashMap<>(); private final List 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 searchLeaders = new HashMap<>(); private final Map searchSettings = new HashMap<>(); @@ -65,6 +61,17 @@ public class PartySearchCoordinator { private static final Map> mapNeighbors = fetchNeighbouringMaps(); private static final Map 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> fetchNeighbouringMaps() { Map> 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); } diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java b/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java index 661f0069e5..60056e8879 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java @@ -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> echelon = new HashMap<>(20); + public PartySearchEchelon() { + ReadWriteLock partySearchLock = new ReentrantReadWriteLock(true); + this.psRLock = partySearchLock.readLock(); + this.psWLock = partySearchLock.writeLock(); + } + public List exportEchelon() { psWLock.lock(); // reversing read/write actually could provide a lax yet sure performance/precision trade-off here try { diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java b/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java index 66aa36f5ca..27a8407e69 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java @@ -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 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 getStorageList() { psRLock.lock(); diff --git a/src/main/java/server/life/MobSkillFactory.java b/src/main/java/server/life/MobSkillFactory.java index 23463bb962..055cbbc695 100644 --- a/src/main/java/server/life/MobSkillFactory.java +++ b/src/main/java/server/life/MobSkillFactory.java @@ -21,12 +21,6 @@ along with this program. If not, see . */ 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 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(); } } } diff --git a/src/main/java/server/maps/DoorObject.java b/src/main/java/server/maps/DoorObject.java index 2af6da1821..12f3ac4ab0 100644 --- a/src/main/java/server/maps/DoorObject.java +++ b/src/main/java/server/maps/DoorObject.java @@ -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) { diff --git a/src/main/java/server/maps/MapManager.java b/src/main/java/server/maps/MapManager.java index 547339a4e5..4b79038abf 100644 --- a/src/main/java/server/maps/MapManager.java +++ b/src/main/java/server/maps/MapManager.java @@ -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 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) { diff --git a/src/main/java/tools/IntervalBuilder.java b/src/main/java/tools/IntervalBuilder.java index e02e9ae657..77a1c3cf78 100644 --- a/src/main/java/tools/IntervalBuilder.java +++ b/src/main/java/tools/IntervalBuilder.java @@ -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 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) {