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

@@ -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();