Remove monitored locks (fair), use basic version

This commit is contained in:
P0nk
2022-08-11 14:45:48 +02:00
parent 54878ebe8c
commit 4fb632ecdb
22 changed files with 50 additions and 175 deletions

View File

@@ -45,8 +45,6 @@ import net.packet.Packet;
import net.server.PlayerBuffValueHolder; import net.server.PlayerBuffValueHolder;
import net.server.PlayerCoolDownValueHolder; import net.server.PlayerCoolDownValueHolder;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.coordinator.world.InviteCoordinator; import net.server.coordinator.world.InviteCoordinator;
import net.server.guild.Alliance; import net.server.guild.Alliance;
import net.server.guild.Guild; import net.server.guild.Guild;
@@ -217,9 +215,9 @@ public class Character extends AbstractCharacterObject {
private ScheduledFuture<?> chairRecoveryTask = null; private ScheduledFuture<?> chairRecoveryTask = null;
private ScheduledFuture<?> pendantOfSpirit = null; //1122017 private ScheduledFuture<?> pendantOfSpirit = null; //1122017
private ScheduledFuture<?> cpqSchedule = null; private ScheduledFuture<?> cpqSchedule = null;
private final Lock chrLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHARACTER_CHR, true); private final Lock chrLock = new ReentrantLock(true);
private final Lock evtLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHARACTER_EVT, true); private final Lock evtLock = new ReentrantLock(true);
private final Lock petLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHARACTER_PET, true); private final Lock petLock = new ReentrantLock(true);
private final Lock prtLock = new ReentrantLock(); private final Lock prtLock = new ReentrantLock();
private final Lock cpnLock = new ReentrantLock(); private final Lock cpnLock = new ReentrantLock();
private final Map<Integer, Set<Integer>> excluded = new LinkedHashMap<>(); private final Map<Integer, Set<Integer>> excluded = new LinkedHashMap<>();

View File

@@ -36,8 +36,6 @@ import net.packet.Packet;
import net.packet.logging.LoggingUtil; import net.packet.logging.LoggingUtil;
import net.packet.logging.MonitoredChrLogger; import net.packet.logging.MonitoredChrLogger;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.channel.Channel; import net.server.channel.Channel;
import net.server.coordinator.login.LoginBypassCoordinator; import net.server.coordinator.login.LoginBypassCoordinator;
import net.server.coordinator.session.Hwid; import net.server.coordinator.session.Hwid;
@@ -81,6 +79,7 @@ import java.util.Date;
import java.util.*; import java.util.*;
import java.util.concurrent.Semaphore; import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
@@ -122,9 +121,9 @@ public class Client extends ChannelInboundHandlerAdapter {
private byte gender = -1; private byte gender = -1;
private boolean disconnecting = false; private boolean disconnecting = false;
private final Semaphore actionsSemaphore = new Semaphore(7); private final Semaphore actionsSemaphore = new Semaphore(7);
private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CLIENT, true); private final Lock lock = new ReentrantLock(true);
private final Lock encoderLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CLIENT_ENCODER, true); private final Lock encoderLock = new ReentrantLock(true);
private final Lock announcerLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CLIENT_ANNOUNCER, true); private final Lock announcerLock = new ReentrantLock(true);
// thanks Masterrulax & try2hack for pointing out a bottleneck issue with shared locks, shavit for noticing an opportunity for improvement // thanks Masterrulax & try2hack for pointing out a bottleneck issue with shared locks, shavit for noticing an opportunity for improvement
private Calendar tempBanCalendar; private Calendar tempBanCalendar;
private int votePoints; private int votePoints;

View File

@@ -25,8 +25,6 @@ import client.Character;
import client.Client; import client.Client;
import client.inventory.manipulator.InventoryManipulator; import client.inventory.manipulator.InventoryManipulator;
import constants.inventory.ItemConstants; import constants.inventory.ItemConstants;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import server.ItemInformationProvider; import server.ItemInformationProvider;
@@ -36,6 +34,7 @@ import tools.Pair;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Matze, Ronan * @author Matze, Ronan
@@ -44,7 +43,7 @@ public class Inventory implements Iterable<Item> {
private static final Logger log = LoggerFactory.getLogger(Inventory.class); private static final Logger log = LoggerFactory.getLogger(Inventory.class);
protected final Map<Short, Item> inventory; protected final Map<Short, Item> inventory;
protected final InventoryType type; protected final InventoryType type;
protected final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.INVENTORY, true); protected final Lock lock = new ReentrantLock(true);
protected Character owner; protected Character owner;
protected byte slotLimit; protected byte slotLimit;

View File

@@ -20,8 +20,6 @@
*/ */
package client.inventory; package client.inventory;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import tools.DatabaseConnection; import tools.DatabaseConnection;
import tools.Pair; import tools.Pair;
@@ -29,6 +27,7 @@ import java.sql.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Flav * @author Flav
@@ -52,7 +51,7 @@ public enum ItemFactory {
static { static {
for (int i = 0; i < lockCount; i++) { for (int i = 0; i < lockCount; i++) {
locks[i] = MonitoredReentrantLockFactory.createLock(MonitoredLockType.ITEM, true); locks[i] = new ReentrantLock(true);
} }
} }

View File

@@ -22,8 +22,6 @@
package net.server; package net.server;
import client.Disease; import client.Disease;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.life.MobSkill; import server.life.MobSkill;
import tools.Pair; import tools.Pair;
@@ -31,6 +29,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Danny//changed to map :3 * @author Danny//changed to map :3
@@ -38,7 +37,7 @@ import java.util.concurrent.locks.Lock;
*/ */
public class PlayerBuffStorage { public class PlayerBuffStorage {
private final int id = (int) (Math.random() * 100); private final int id = (int) (Math.random() * 100);
private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.BUFF_STORAGE, true); private final Lock lock = new ReentrantLock(true);
private final Map<Integer, List<PlayerBuffValueHolder>> buffs = new HashMap<>(); private final Map<Integer, List<PlayerBuffValueHolder>> buffs = new HashMap<>();
private final Map<Integer, Map<Disease, Pair<Long, MobSkill>>> diseases = new HashMap<>(); private final Map<Integer, Map<Disease, Pair<Long, MobSkill>>> diseases = new HashMap<>();

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.MonitoredLockType;
import net.server.audit.locks.active.TrackerReentrantLock;
/**
* @author RonanLana
*/
public class MonitoredReentrantLockFactory {
public static TrackerReentrantLock createLock(MonitoredLockType id, boolean fair) {
return new TrackerReentrantLock(id, fair);
}
}

View File

@@ -22,9 +22,6 @@ package net.server.coordinator.world;
import client.Character; import client.Character;
import config.YamlConfig; import config.YamlConfig;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.TimerManager; import server.TimerManager;
import server.life.Monster; import server.life.Monster;
import server.maps.MapleMap; import server.maps.MapleMap;
@@ -41,7 +38,7 @@ import java.util.concurrent.locks.ReentrantLock;
*/ */
public class MonsterAggroCoordinator { public class MonsterAggroCoordinator {
private final Lock lock = new ReentrantLock(); private final Lock lock = new ReentrantLock();
private final MonitoredReentrantLock idleLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.MAP_AGGRO_IDLE, true); private final Lock idleLock = new ReentrantLock(true);
private long lastStopTime = Server.getInstance().getCurrentTime(); private long lastStopTime = Server.getInstance().getCurrentTime();
private ScheduledFuture<?> aggroMonitor = null; private ScheduledFuture<?> aggroMonitor = null;

View File

@@ -27,8 +27,6 @@ import config.YamlConfig;
import net.packet.Packet; import net.packet.Packet;
import net.server.PlayerStorage; import net.server.PlayerStorage;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.channel.Channel; import net.server.channel.Channel;
import net.server.coordinator.matchchecker.MatchCheckerCoordinator; import net.server.coordinator.matchchecker.MatchCheckerCoordinator;
import net.server.coordinator.world.InviteCoordinator; import net.server.coordinator.world.InviteCoordinator;
@@ -45,6 +43,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Guild { public class Guild {
private static final Logger log = LoggerFactory.getLogger(Guild.class); private static final Logger log = LoggerFactory.getLogger(Guild.class);
@@ -54,7 +53,7 @@ public class Guild {
} }
private final List<GuildCharacter> members; private final List<GuildCharacter> members;
private final Lock membersLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.GUILD, true); private final Lock membersLock = new ReentrantLock(true);
private final String[] rankTitles = new String[5]; // 1 = master, 2 = jr, 5 = lowest member private final String[] rankTitles = new String[5]; // 1 = master, 2 = jr, 5 = lowest member
private String name, notice; private String name, notice;

View File

@@ -21,16 +21,16 @@ package net.server.services;
import config.YamlConfig; import config.YamlConfig;
import net.server.Server; import net.server.Server;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType; import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock; import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.TimerManager; import server.TimerManager;
import tools.Pair; import tools.Pair;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Ronan * @author Ronan
@@ -42,17 +42,14 @@ public abstract class BaseScheduler {
private final Map<Object, Pair<Runnable, Long>> registeredEntries = new HashMap<>(); private final Map<Object, Pair<Runnable, Long>> registeredEntries = new HashMap<>();
private ScheduledFuture<?> schedulerTask = null; private ScheduledFuture<?> schedulerTask = null;
private MonitoredReentrantLock schedulerLock; private final Lock schedulerLock = new ReentrantLock(true);
private final Runnable monitorTask = () -> runBaseSchedule(); private final Runnable monitorTask = () -> runBaseSchedule();
protected BaseScheduler(MonitoredLockType lockType) { protected BaseScheduler(MonitoredLockType lockType) {
schedulerLock = MonitoredReentrantLockFactory.createLock(lockType, true);
} }
// NOTE: practice EXTREME caution when adding external locks to the scheduler system, if you don't know what you're doing DON'T USE THIS. // NOTE: practice EXTREME caution when adding external locks to the scheduler system, if you don't know what you're doing DON'T USE THIS.
protected BaseScheduler(MonitoredLockType lockType, List<MonitoredReentrantLock> extLocks) { protected BaseScheduler(MonitoredLockType lockType, List<MonitoredReentrantLock> extLocks) {
schedulerLock = MonitoredReentrantLockFactory.createLock(lockType, true);
externalLocks.addAll(extLocks); externalLocks.addAll(extLocks);
} }
@@ -184,15 +181,5 @@ public abstract class BaseScheduler {
unlockScheduler(); unlockScheduler();
externalLocks.clear(); externalLocks.clear();
} }
disposeLocks();
}
private void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
schedulerLock = schedulerLock.dispose();
} }
} }

View File

@@ -20,15 +20,14 @@
package net.server.services.task.channel; package net.server.services.task.channel;
import config.YamlConfig; import config.YamlConfig;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType; import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.services.BaseScheduler; import net.server.services.BaseScheduler;
import net.server.services.BaseService; import net.server.services.BaseService;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Ronan * @author Ronan
@@ -63,7 +62,7 @@ public class MobAnimationService extends BaseService {
private class MobAnimationScheduler extends BaseScheduler { private class MobAnimationScheduler extends BaseScheduler {
Set<Integer> onAnimationMobs = new HashSet<>(1000); Set<Integer> onAnimationMobs = new HashSet<>(1000);
private MonitoredReentrantLock animationLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL_MOBANIMAT, true); private final Lock animationLock = new ReentrantLock(true);
public MobAnimationScheduler() { public MobAnimationScheduler() {
super(MonitoredLockType.CHANNEL_MOBACTION); super(MonitoredLockType.CHANNEL_MOBACTION);
@@ -98,18 +97,9 @@ public class MobAnimationService extends BaseService {
@Override @Override
public void dispose() { public void dispose() {
disposeLocks();
super.dispose(); super.dispose();
} }
private void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
animationLock = animationLock.dispose();
}
} }
} }

View File

@@ -21,10 +21,7 @@ package net.server.services.task.channel;
import client.status.MonsterStatusEffect; import client.status.MonsterStatusEffect;
import config.YamlConfig; import config.YamlConfig;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType; import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.services.BaseScheduler; import net.server.services.BaseScheduler;
import net.server.services.BaseService; import net.server.services.BaseService;
@@ -32,6 +29,8 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Ronan * @author Ronan
@@ -71,7 +70,7 @@ public class MobStatusService extends BaseService {
private class MobStatusScheduler extends BaseScheduler { private class MobStatusScheduler extends BaseScheduler {
private final Map<MonsterStatusEffect, MobStatusOvertimeEntry> registeredMobStatusOvertime = new HashMap<>(); private final Map<MonsterStatusEffect, MobStatusOvertimeEntry> registeredMobStatusOvertime = new HashMap<>();
private MonitoredReentrantLock overtimeStatusLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL_OVTSTATUS, true); private final Lock overtimeStatusLock = new ReentrantLock(true);
private class MobStatusOvertimeEntry { private class MobStatusOvertimeEntry {
private int procCount; private int procCount;
@@ -144,18 +143,9 @@ public class MobStatusService extends BaseService {
@Override @Override
public void dispose() { public void dispose() {
disposeLocks();
super.dispose(); super.dispose();
} }
private void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
overtimeStatusLock = overtimeStatusLock.dispose();
}
} }
} }

View File

@@ -24,10 +24,6 @@ package net.server.world;
import client.Character; import client.Character;
import client.Client; import client.Client;
import config.YamlConfig; import config.YamlConfig;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.coordinator.matchchecker.MatchCheckerCoordinator; import net.server.coordinator.matchchecker.MatchCheckerCoordinator;
import net.server.coordinator.matchchecker.MatchCheckerListenerFactory.MatchCheckerType; import net.server.coordinator.matchchecker.MatchCheckerListenerFactory.MatchCheckerType;
import scripting.event.EventInstanceManager; import scripting.event.EventInstanceManager;
@@ -38,6 +34,8 @@ import tools.PacketCreator;
import java.util.*; import java.util.*;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Party { public class Party {
@@ -52,7 +50,7 @@ public class Party {
private final Map<Integer, Door> doors = new HashMap<>(); private final Map<Integer, Door> doors = new HashMap<>();
private MonitoredReentrantLock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.PARTY, true); private final Lock lock = new ReentrantLock(true);
public Party(int id, PartyCharacter chrfor) { public Party(int id, PartyCharacter chrfor) {
this.leaderId = chrfor.getId(); this.leaderId = chrfor.getId();
@@ -281,14 +279,6 @@ public class Party {
} }
} }
public void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
lock = lock.dispose();
}
@Override @Override
public int hashCode() { public int hashCode() {
final int prime = 31; final int prime = 31;

View File

@@ -2103,10 +2103,6 @@ public class World {
partyLock.unlock(); partyLock.unlock();
} }
for (Party p : pList) {
p.disposeLocks();
}
closeWorldServices(); closeWorldServices();
} }

View File

@@ -21,10 +21,6 @@ package scripting.event.scheduler;
import config.YamlConfig; import config.YamlConfig;
import net.server.Server; import net.server.Server;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.ThreadManager; import server.ThreadManager;
import server.TimerManager; import server.TimerManager;
@@ -34,6 +30,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Ronan * @author Ronan
@@ -45,13 +43,9 @@ public class EventScriptScheduler {
private final Map<Runnable, Long> registeredEntries = new HashMap<>(); private final Map<Runnable, Long> registeredEntries = new HashMap<>();
private ScheduledFuture<?> schedulerTask = null; private ScheduledFuture<?> schedulerTask = null;
private MonitoredReentrantLock schedulerLock; private final Lock schedulerLock = new ReentrantLock(true);
private final Runnable monitorTask = () -> runBaseSchedule(); private final Runnable monitorTask = () -> runBaseSchedule();
public EventScriptScheduler() {
schedulerLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.EM_SCHDL, true);
}
private void runBaseSchedule() { private void runBaseSchedule() {
List<Runnable> toRemove; List<Runnable> toRemove;
Map<Runnable, Long> registeredEntriesCopy; Map<Runnable, Long> registeredEntriesCopy;
@@ -148,16 +142,6 @@ public class EventScriptScheduler {
} finally { } finally {
schedulerLock.unlock(); schedulerLock.unlock();
} }
disposeLocks();
}); });
} }
private void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
schedulerLock = schedulerLock.dispose();
}
} }

View File

@@ -23,8 +23,6 @@ import client.inventory.InventoryType;
import client.inventory.Item; import client.inventory.Item;
import client.inventory.ItemFactory; import client.inventory.ItemFactory;
import constants.game.GameConstants; import constants.game.GameConstants;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import provider.Data; import provider.Data;
@@ -42,6 +40,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Matze * @author Matze
@@ -57,7 +56,7 @@ public class Storage {
private byte slots; private byte slots;
private final Map<InventoryType, List<Item>> typeItems = new HashMap<>(); private final Map<InventoryType, List<Item>> typeItems = new HashMap<>();
private List<Item> items = new LinkedList<>(); private List<Item> items = new LinkedList<>();
private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.STORAGE, true); private final Lock lock = new ReentrantLock(true);
private Storage(int id, byte slots, int meso) { private Storage(int id, byte slots, int meso) {
this.id = id; this.id = id;

View File

@@ -28,9 +28,6 @@ import constants.id.MobId;
import net.packet.Packet; import net.packet.Packet;
import net.server.PlayerStorage; import net.server.PlayerStorage;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.channel.Channel; import net.server.channel.Channel;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -45,6 +42,8 @@ import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.util.concurrent.TimeUnit.MINUTES; import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
@@ -100,7 +99,7 @@ public class Expedition {
private final boolean silent; private final boolean silent;
private final int minSize; private final int minSize;
private final int maxSize; private final int maxSize;
private final MonitoredReentrantLock pL = MonitoredReentrantLockFactory.createLock(MonitoredLockType.EIM_PARTY, true); private final Lock pL = new ReentrantLock(true);
public Expedition(Character player, ExpeditionType met, boolean sil, int minPlayers, int maxPlayers) { public Expedition(Character player, ExpeditionType met, boolean sil, int minPlayers, int maxPlayers) {
leader = player; leader = player;

View File

@@ -29,10 +29,6 @@ import config.YamlConfig;
import constants.id.MobId; import constants.id.MobId;
import constants.skills.*; import constants.skills.*;
import net.packet.Packet; import net.packet.Packet;
import net.server.audit.LockCollector;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.channel.Channel; import net.server.channel.Channel;
import net.server.coordinator.world.MonsterAggroCoordinator; import net.server.coordinator.world.MonsterAggroCoordinator;
import net.server.services.task.channel.MobAnimationService; import net.server.services.task.channel.MobAnimationService;
@@ -101,7 +97,7 @@ public class Monster extends AbstractLoadedLife {
private boolean availablePuppetUpdate = true; private boolean availablePuppetUpdate = true;
private final Lock externalLock = new ReentrantLock(); private final Lock externalLock = new ReentrantLock();
private MonitoredReentrantLock monsterLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.MOB, true); private final Lock monsterLock = new ReentrantLock(true);
private final Lock statiLock = new ReentrantLock(); private final Lock statiLock = new ReentrantLock();
private final Lock animationLock = new ReentrantLock(); private final Lock animationLock = new ReentrantLock();
private final Lock aggroUpdateLock = new ReentrantLock(); private final Lock aggroUpdateLock = new ReentrantLock();
@@ -2197,14 +2193,5 @@ public class Monster extends AbstractLoadedLife {
} }
this.getMap().dismissRemoveAfter(this); this.getMap().dismissRemoveAfter(this);
disposeLocks();
}
private void disposeLocks() {
LockCollector.getInstance().registerDisposeAction(() -> emptyLocks());
}
private void emptyLocks() {
monsterLock = monsterLock.dispose();
} }
} }

View File

@@ -25,13 +25,12 @@ import client.Character;
import client.Client; import client.Client;
import constants.game.GameConstants; import constants.game.GameConstants;
import constants.id.MapId; import constants.id.MapId;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.MonitoredReentrantLock;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import scripting.portal.PortalScriptManager; import scripting.portal.PortalScriptManager;
import tools.PacketCreator; import tools.PacketCreator;
import java.awt.*; import java.awt.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class GenericPortal implements Portal { public class GenericPortal implements Portal {
private String name; private String name;
@@ -43,7 +42,7 @@ public class GenericPortal implements Portal {
private int id; private int id;
private String scriptName; private String scriptName;
private boolean portalState; private boolean portalState;
private MonitoredReentrantLock scriptLock = null; private Lock scriptLock = null;
public GenericPortal(int type) { public GenericPortal(int type) {
this.type = type; this.type = type;
@@ -120,7 +119,7 @@ public class GenericPortal implements Portal {
if (scriptName != null) { if (scriptName != null) {
if (scriptLock == null) { if (scriptLock == null) {
scriptLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.PORTAL, true); scriptLock = new ReentrantLock(true);
} }
} else { } else {
scriptLock = null; scriptLock = null;

View File

@@ -33,8 +33,6 @@ import client.processor.npc.FredrickProcessor;
import config.YamlConfig; import config.YamlConfig;
import net.packet.Packet; import net.packet.Packet;
import net.server.Server; import net.server.Server;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.ItemInformationProvider; import server.ItemInformationProvider;
import server.Trade; import server.Trade;
import tools.DatabaseConnection; import tools.DatabaseConnection;
@@ -50,6 +48,7 @@ import java.time.Instant;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author XoticStory * @author XoticStory
@@ -76,7 +75,7 @@ public class HiredMerchant extends AbstractMapObject {
private final Visitor[] visitors = new Visitor[3]; private final Visitor[] visitors = new Visitor[3];
private final LinkedList<PastVisitor> visitorHistory = new LinkedList<>(); private final LinkedList<PastVisitor> visitorHistory = new LinkedList<>();
private final LinkedHashSet<String> blacklist = new LinkedHashSet<>(); // case-sensitive character names private final LinkedHashSet<String> blacklist = new LinkedHashSet<>(); // case-sensitive character names
private final Lock visitorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.VISITOR_MERCH, true); private final Lock visitorLock = new ReentrantLock(true);
private record Visitor(Character chr, Instant enteredAt) {} private record Visitor(Character chr, Instant enteredAt) {}

View File

@@ -20,8 +20,6 @@
package server.maps; package server.maps;
import client.Character; import client.Character;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.TimerManager; import server.TimerManager;
import tools.PacketCreator; import tools.PacketCreator;
@@ -29,6 +27,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
@@ -38,7 +37,7 @@ import static java.util.concurrent.TimeUnit.SECONDS;
public class MiniDungeon { public class MiniDungeon {
List<Character> players = new ArrayList<>(); List<Character> players = new ArrayList<>();
ScheduledFuture<?> timeoutTask = null; ScheduledFuture<?> timeoutTask = null;
Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.MINIDUNGEON, true); private final Lock lock = new ReentrantLock(true);
int baseMap; int baseMap;
long expireTime; long expireTime;

View File

@@ -29,8 +29,6 @@ import client.inventory.Item;
import client.inventory.manipulator.InventoryManipulator; import client.inventory.manipulator.InventoryManipulator;
import client.inventory.manipulator.KarmaManipulator; import client.inventory.manipulator.KarmaManipulator;
import net.packet.Packet; import net.packet.Packet;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import server.Trade; import server.Trade;
import tools.PacketCreator; import tools.PacketCreator;
import tools.Pair; import tools.Pair;
@@ -38,6 +36,7 @@ import tools.Pair;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Matze * @author Matze
@@ -56,7 +55,7 @@ public class PlayerShop extends AbstractMapObject {
private final List<String> bannedList = new ArrayList<>(); private final List<String> bannedList = new ArrayList<>();
private final List<Pair<Character, String>> chatLog = new LinkedList<>(); private final List<Pair<Character, String>> chatLog = new LinkedList<>();
private final Map<Integer, Byte> chatSlot = new LinkedHashMap<>(); private final Map<Integer, Byte> chatSlot = new LinkedHashMap<>();
private final Lock visitorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.VISITOR_PSHOP, true); private final Lock visitorLock = new ReentrantLock(true);
public PlayerShop(Character owner, String description, int itemid) { public PlayerShop(Character owner, String description, int itemid) {
this.setPosition(owner.getPosition()); this.setPosition(owner.getPosition());

View File

@@ -24,8 +24,6 @@ package server.maps;
import client.Client; import client.Client;
import config.YamlConfig; import config.YamlConfig;
import net.packet.Packet; import net.packet.Packet;
import net.server.audit.locks.MonitoredLockType;
import net.server.audit.locks.factory.MonitoredReentrantLockFactory;
import net.server.services.task.channel.OverallService; import net.server.services.task.channel.OverallService;
import net.server.services.type.ChannelServices; import net.server.services.type.ChannelServices;
import scripting.reactor.ReactorScriptManager; import scripting.reactor.ReactorScriptManager;
@@ -38,6 +36,7 @@ import java.awt.*;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/** /**
* @author Lerk * @author Lerk
@@ -58,8 +57,8 @@ public class Reactor extends AbstractMapObject {
private Runnable delayedRespawnRun = null; private Runnable delayedRespawnRun = null;
private GuardianSpawnPoint guardian = null; private GuardianSpawnPoint guardian = null;
private byte facingDirection = 0; private byte facingDirection = 0;
private final Lock reactorLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.REACTOR, true); private final Lock reactorLock = new ReentrantLock(true);
private final Lock hitLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.REACTOR_HIT, true); private final Lock hitLock = new ReentrantLock(true);
public Reactor(ReactorStats stats, int rid) { public Reactor(ReactorStats stats, int rid) {
this.evstate = (byte) 0; this.evstate = (byte) 0;