5c7081fecc
* Updated Upstream (Bukkit/CraftBukkit) Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 45690fe9 SPIGOT-5047: Correct slot types for 1.14 inventories CraftBukkit Changes: 4090d01f SPIGOT-5047: Correct slot types for 1.14 inventories e8c08362 SPIGOT-5046: World#getLoadedChunks returning inaccessible cached chunks. d445af3b SPIGOT-5067: Add item meta for 1.14 spawn eggs * Bring Chunk load checks in-line with spigot As of the last upstream merge spigot now checks ticket level status when returning loaded chunks for a world from api. Now our checks will respect that decision. * Fix spawn ticket levels Vanilla would keep the inner chunks of spawn available for ticking, however my changes made all chunks non-ticking. Resolve by changing ticket levels for spawn chunks inside the border to respect this behavior. * Make World#getChunkIfLoadedImmediately return only entity ticking chunks Mojang appears to be using chunks with level > 33 (non-ticking chunks) as cached chunks and not actually loaded chunks. * Bring all loaded checks in line with spigot Loaded chunks must be at least border chunks, or level <= 33
93 lines
4.3 KiB
Diff
93 lines
4.3 KiB
Diff
From db3f81a458a83b49003a7a119b920bc5ba79072c Mon Sep 17 00:00:00 2001
|
|
From: crast <contact@jamescrasta.com>
|
|
Date: Sat, 1 Jun 2013 13:52:30 -0600
|
|
Subject: [PATCH] Reduce thread synchronization in MetadataStoreBase
|
|
|
|
Use ConcurrentHashMap to allow thread-safe access methods and very
|
|
limited synchronized portions to allow much higher concurrency in
|
|
MetadataStore as well as far less locking, especially on reads
|
|
|
|
diff --git a/src/main/java/org/bukkit/metadata/MetadataStoreBase.java b/src/main/java/org/bukkit/metadata/MetadataStoreBase.java
|
|
index 027953499..b3d85d973 100644
|
|
--- a/src/main/java/org/bukkit/metadata/MetadataStoreBase.java
|
|
+++ b/src/main/java/org/bukkit/metadata/MetadataStoreBase.java
|
|
@@ -12,7 +12,7 @@ import org.bukkit.plugin.Plugin;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
public abstract class MetadataStoreBase<T> {
|
|
- private Map<String, Map<Plugin, MetadataValue>> metadataMap = new HashMap<String, Map<Plugin, MetadataValue>>();
|
|
+ private Map<String, Map<Plugin, MetadataValue>> metadataMap = new java.util.concurrent.ConcurrentHashMap<String, Map<Plugin, MetadataValue>>(); // Paper
|
|
|
|
/**
|
|
* Adds a metadata value to an object. Each metadata value is owned by a
|
|
@@ -46,7 +46,9 @@ public abstract class MetadataStoreBase<T> {
|
|
entry = new WeakHashMap<Plugin, MetadataValue>(1);
|
|
metadataMap.put(key, entry);
|
|
}
|
|
- entry.put(owningPlugin, newMetadataValue);
|
|
+ synchronized (entry) {
|
|
+ entry.put(owningPlugin, newMetadataValue);
|
|
+ }
|
|
}
|
|
|
|
/**
|
|
@@ -60,10 +62,11 @@ public abstract class MetadataStoreBase<T> {
|
|
* @see MetadataStore#getMetadata(Object, String)
|
|
*/
|
|
@NotNull
|
|
- public synchronized List<MetadataValue> getMetadata(@NotNull T subject, @NotNull String metadataKey) {
|
|
+ public List<MetadataValue> getMetadata(@NotNull T subject, @NotNull String metadataKey) { // Paper
|
|
String key = disambiguate(subject, metadataKey);
|
|
- if (metadataMap.containsKey(key)) {
|
|
- Collection<MetadataValue> values = metadataMap.get(key).values();
|
|
+ Map<Plugin, MetadataValue> entry = metadataMap.get(key);
|
|
+ if (entry != null) {
|
|
+ Collection<MetadataValue> values = entry.values();
|
|
return Collections.unmodifiableList(new ArrayList<MetadataValue>(values));
|
|
} else {
|
|
return Collections.emptyList();
|
|
@@ -78,7 +81,7 @@ public abstract class MetadataStoreBase<T> {
|
|
* @param metadataKey the unique metadata key being queried.
|
|
* @return the existence of the metadataKey within subject.
|
|
*/
|
|
- public synchronized boolean hasMetadata(@NotNull T subject, @NotNull String metadataKey) {
|
|
+ public boolean hasMetadata(@NotNull T subject, @NotNull String metadataKey) { // Paper
|
|
String key = disambiguate(subject, metadataKey);
|
|
return metadataMap.containsKey(key);
|
|
}
|
|
@@ -94,17 +97,18 @@ public abstract class MetadataStoreBase<T> {
|
|
* org.bukkit.plugin.Plugin)
|
|
* @throws IllegalArgumentException If plugin is null
|
|
*/
|
|
- public synchronized void removeMetadata(@NotNull T subject, @NotNull String metadataKey, @NotNull Plugin owningPlugin) {
|
|
+ public void removeMetadata(@NotNull T subject, @NotNull String metadataKey, @NotNull Plugin owningPlugin) { // Paper
|
|
Validate.notNull(owningPlugin, "Plugin cannot be null");
|
|
String key = disambiguate(subject, metadataKey);
|
|
Map<Plugin, MetadataValue> entry = metadataMap.get(key);
|
|
if (entry == null) {
|
|
return;
|
|
}
|
|
-
|
|
- entry.remove(owningPlugin);
|
|
- if (entry.isEmpty()) {
|
|
- metadataMap.remove(key);
|
|
+ synchronized (entry) {
|
|
+ entry.remove(owningPlugin);
|
|
+ if (entry.isEmpty()) {
|
|
+ metadataMap.remove(key);
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -117,7 +121,7 @@ public abstract class MetadataStoreBase<T> {
|
|
* @see MetadataStore#invalidateAll(org.bukkit.plugin.Plugin)
|
|
* @throws IllegalArgumentException If plugin is null
|
|
*/
|
|
- public synchronized void invalidateAll(@NotNull Plugin owningPlugin) {
|
|
+ public void invalidateAll(@NotNull Plugin owningPlugin) { // Paper
|
|
Validate.notNull(owningPlugin, "Plugin cannot be null");
|
|
for (Map<Plugin, MetadataValue> values : metadataMap.values()) {
|
|
if (values.containsKey(owningPlugin)) {
|
|
--
|
|
2.21.0
|
|
|