Skip to content

Commit 9a6e567

Browse files
authored
Merge pull request #142 from TheNextLvl-net/thread-safety
Improved thread safety
2 parents 52afe46 + 84de6de commit 9a6e567

File tree

3 files changed

+28
-25
lines changed

3 files changed

+28
-25
lines changed

src/main/java/net/thenextlvl/tweaks/controller/BackController.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,52 +7,53 @@
77
import org.jspecify.annotations.Nullable;
88

99
import java.util.Map;
10-
import java.util.WeakHashMap;
10+
import java.util.UUID;
1111
import java.util.concurrent.BlockingDeque;
12+
import java.util.concurrent.ConcurrentHashMap;
1213
import java.util.concurrent.LinkedBlockingDeque;
1314

1415
@NullMarked
1516
public class BackController {
16-
private final Map<Player, BlockingDeque<Location>> positions = new WeakHashMap<>();
17-
private final Map<Player, Location> positionLock = new WeakHashMap<>();
17+
private final Map<UUID, BlockingDeque<Location>> positions = new ConcurrentHashMap<>();
18+
private final Map<UUID, Location> positionLock = new ConcurrentHashMap<>();
1819
private final TweaksPlugin plugin;
1920

2021
public BackController(TweaksPlugin plugin) {
2122
this.plugin = plugin;
2223
}
2324

2425
public @Nullable Location peekFirst(Player player) {
25-
var deque = positions.get(player);
26+
var deque = positions.get(player.getUniqueId());
2627
if (deque == null) return null;
2728
deque.removeIf(location -> !location.isWorldLoaded());
2829
return deque.peekFirst();
2930
}
3031

3132
public void offerFirst(Player player, Location location) {
32-
positions.computeIfAbsent(player, ignored ->
33-
new LinkedBlockingDeque<>(plugin.config().general.backBufferStackSize)
34-
).offerFirst(location);
33+
positions.computeIfAbsent(player.getUniqueId(), ignored -> {
34+
return new LinkedBlockingDeque<>(plugin.config().general.backBufferStackSize);
35+
}).offerFirst(location);
3536
}
3637

3738
public void remove(Player player, Location location) {
38-
positions.computeIfPresent(player, (ignored, locations) ->
39+
positions.computeIfPresent(player.getUniqueId(), (ignored, locations) ->
3940
locations.remove(location) && locations.isEmpty() ? null : locations);
4041
}
4142

4243
public void remove(Player player) {
43-
positionLock.remove(player);
44-
positions.remove(player);
44+
positionLock.remove(player.getUniqueId());
45+
positions.remove(player.getUniqueId());
4546
}
4647

4748
public @Nullable Location getLock(Player player) {
48-
return positionLock.get(player);
49+
return positionLock.get(player.getUniqueId());
4950
}
5051

5152
public void lock(Player player, Location location) {
52-
positionLock.put(player, location);
53+
positionLock.put(player.getUniqueId(), location);
5354
}
5455

5556
public void unlock(Player player) {
56-
positionLock.remove(player);
57+
positionLock.remove(player.getUniqueId());
5758
}
5859
}

src/main/java/net/thenextlvl/tweaks/controller/TPAController.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import org.jspecify.annotations.NullMarked;
77

88
import java.util.*;
9+
import java.util.concurrent.ConcurrentHashMap;
910

1011
@NullMarked
1112
public class TPAController {
12-
private final Map<Player, Set<Request>> requests = new WeakHashMap<>();
13+
private final Map<UUID, Set<Request>> requests = new ConcurrentHashMap<>();
1314
private final TweaksPlugin plugin;
1415

1516
public TPAController(TweaksPlugin plugin) {
@@ -19,7 +20,7 @@ public TPAController(TweaksPlugin plugin) {
1920
public void removeRequests(Player player) {
2021
requests.values().forEach(requests -> requests.removeIf(request -> request.player().equals(player)));
2122
requests.values().removeIf(Collection::isEmpty);
22-
requests.remove(player);
23+
requests.remove(player.getUniqueId());
2324
}
2425

2526
public Optional<Request> getRequest(Player player, Player target) {
@@ -29,13 +30,13 @@ public Optional<Request> getRequest(Player player, Player target) {
2930
}
3031

3132
public List<Request> getRequests(Player player) {
32-
var requests = this.requests.get(player);
33+
var requests = this.requests.get(player.getUniqueId());
3334
if (requests == null) return List.of();
3435
return List.copyOf(requests);
3536
}
3637

3738
public boolean addRequest(Player player, Player sender, RequestType type) {
38-
var players = requests.computeIfAbsent(player, ignored -> new HashSet<>());
39+
var players = requests.computeIfAbsent(player.getUniqueId(), ignored -> new HashSet<>());
3940
return players.stream().noneMatch(request -> request.player().equals(sender))
4041
&& players.add(new Request(sender, type));
4142
}
@@ -49,10 +50,10 @@ public void expireRequest(Player player, Player sender, RequestType type) {
4950
}
5051

5152
public boolean removeRequest(Player sender, Player player, RequestType type) {
52-
var players = requests.get(sender);
53+
var players = requests.get(sender.getUniqueId());
5354
var result = players != null && players.removeIf(request ->
5455
request.player().equals(player) && request.type() == type);
55-
if (players != null && players.isEmpty()) requests.remove(sender);
56+
if (players != null && players.isEmpty()) requests.remove(sender.getUniqueId());
5657
return result;
5758
}
5859

src/main/java/net/thenextlvl/tweaks/controller/TeleportController.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
import org.jspecify.annotations.NullMarked;
1010

1111
import java.util.Map;
12-
import java.util.WeakHashMap;
12+
import java.util.UUID;
1313
import java.util.concurrent.CompletableFuture;
14+
import java.util.concurrent.ConcurrentHashMap;
1415

1516
@NullMarked
1617
public class TeleportController {
17-
private final Map<Player, Location> teleports = new WeakHashMap<>();
18+
private final Map<UUID, Location> teleports = new ConcurrentHashMap<>();
1819
private final TweaksPlugin plugin;
1920

2021
public TeleportController(TweaksPlugin plugin) {
@@ -25,7 +26,7 @@ public CompletableFuture<Boolean> teleport(Player player, Location location, Pla
2526
var cooldown = plugin.config().teleport.cooldown;
2627
if (cooldown <= 0 || player.hasPermission("tweaks.teleport.cooldown.bypass"))
2728
return player.teleportAsync(location, cause);
28-
if (location.equals(teleports.put(player, location)))
29+
if (location.equals(teleports.put(player.getUniqueId(), location)))
2930
return CompletableFuture.failedFuture(new IllegalStateException());
3031
plugin.bundle().sendMessage(player, plugin.config().teleport.allowMovement
3132
? "command.teleport.cooldown"
@@ -47,15 +48,15 @@ private CompletableFuture<Boolean> scheduleTeleport(Player player, Location loca
4748
if (blockMovements && !player.getWorld().equals(previous.getWorld())) return false;
4849
if (blockMovements && player.getLocation().distanceSquared(previous) > .2) return false;
4950
Preconditions.checkState(player.isConnected());
50-
Preconditions.checkState(location.equals(teleports.getOrDefault(player, location)));
51+
Preconditions.checkState(location.equals(teleports.getOrDefault(player.getUniqueId(), location)));
5152
Thread.sleep(Math.min(50, teleportTime - System.currentTimeMillis()));
5253
}
5354

5455
return true;
5556
} catch (InterruptedException e) {
5657
throw new RuntimeException(e);
5758
} finally {
58-
teleports.remove(player);
59+
teleports.remove(player.getUniqueId());
5960
}
6061
}).thenCompose(success -> {
6162
if (success) return player.teleportAsync(location, cause);
@@ -64,6 +65,6 @@ private CompletableFuture<Boolean> scheduleTeleport(Player player, Location loca
6465
}
6566

6667
public void remove(Player player) {
67-
teleports.remove(player);
68+
teleports.remove(player.getUniqueId());
6869
}
6970
}

0 commit comments

Comments
 (0)