2019-12-23 02:37:47 +00:00
|
|
|
From 05ccd4a953088abcf6c53aa0c838659284e9c092 Mon Sep 17 00:00:00 2001
|
2016-03-29 02:10:01 +00:00
|
|
|
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
|
2019-12-23 02:37:47 +00:00
|
|
|
index baf85022..d363d517 100644
|
2016-03-29 02:10:01 +00:00
|
|
|
--- a/src/main/java/org/bukkit/metadata/MetadataStoreBase.java
|
|
|
|
+++ b/src/main/java/org/bukkit/metadata/MetadataStoreBase.java
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -12,7 +12,7 @@ import org.bukkit.plugin.Plugin;
|
2019-03-20 00:28:15 +00:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2016-03-29 02:10:01 +00:00
|
|
|
|
|
|
|
public abstract class MetadataStoreBase<T> {
|
|
|
|
- private Map<String, Map<Plugin, MetadataValue>> metadataMap = new HashMap<String, Map<Plugin, MetadataValue>>();
|
2019-04-23 04:47:07 +00:00
|
|
|
+ private Map<String, Map<Plugin, MetadataValue>> metadataMap = new java.util.concurrent.ConcurrentHashMap<String, Map<Plugin, MetadataValue>>(); // Paper
|
2016-03-29 02:10:01 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a metadata value to an object. Each metadata value is owned by a
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -46,7 +46,9 @@ public abstract class MetadataStoreBase<T> {
|
2016-03-29 02:10:01 +00:00
|
|
|
entry = new WeakHashMap<Plugin, MetadataValue>(1);
|
|
|
|
metadataMap.put(key, entry);
|
|
|
|
}
|
|
|
|
- entry.put(owningPlugin, newMetadataValue);
|
|
|
|
+ synchronized (entry) {
|
|
|
|
+ entry.put(owningPlugin, newMetadataValue);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -60,10 +62,11 @@ public abstract class MetadataStoreBase<T> {
|
2016-03-29 02:10:01 +00:00
|
|
|
* @see MetadataStore#getMetadata(Object, String)
|
|
|
|
*/
|
2019-03-20 00:28:15 +00:00
|
|
|
@NotNull
|
|
|
|
- public synchronized List<MetadataValue> getMetadata(@NotNull T subject, @NotNull String metadataKey) {
|
|
|
|
+ public List<MetadataValue> getMetadata(@NotNull T subject, @NotNull String metadataKey) { // Paper
|
2016-03-29 02:10:01 +00:00
|
|
|
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();
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -78,7 +81,7 @@ public abstract class MetadataStoreBase<T> {
|
2016-03-29 02:10:01 +00:00
|
|
|
* @param metadataKey the unique metadata key being queried.
|
|
|
|
* @return the existence of the metadataKey within subject.
|
|
|
|
*/
|
2019-03-20 00:28:15 +00:00
|
|
|
- public synchronized boolean hasMetadata(@NotNull T subject, @NotNull String metadataKey) {
|
|
|
|
+ public boolean hasMetadata(@NotNull T subject, @NotNull String metadataKey) { // Paper
|
2016-03-29 02:10:01 +00:00
|
|
|
String key = disambiguate(subject, metadataKey);
|
|
|
|
return metadataMap.containsKey(key);
|
|
|
|
}
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -94,17 +97,18 @@ public abstract class MetadataStoreBase<T> {
|
2019-12-23 02:37:47 +00:00
|
|
|
* @see MetadataStore#removeMetadata(Object, String,
|
2016-03-29 02:10:01 +00:00
|
|
|
* org.bukkit.plugin.Plugin)
|
|
|
|
*/
|
2019-03-20 00:28:15 +00:00
|
|
|
- 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
|
2016-03-29 02:10:01 +00:00
|
|
|
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);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-23 04:47:07 +00:00
|
|
|
@@ -117,7 +121,7 @@ public abstract class MetadataStoreBase<T> {
|
2016-03-29 02:10:01 +00:00
|
|
|
* @throws IllegalArgumentException If plugin is null
|
2019-12-23 02:37:47 +00:00
|
|
|
* @see MetadataStore#invalidateAll(org.bukkit.plugin.Plugin)
|
2016-03-29 02:10:01 +00:00
|
|
|
*/
|
2019-03-20 00:28:15 +00:00
|
|
|
- public synchronized void invalidateAll(@NotNull Plugin owningPlugin) {
|
|
|
|
+ public void invalidateAll(@NotNull Plugin owningPlugin) { // Paper
|
2016-03-29 02:10:01 +00:00
|
|
|
Validate.notNull(owningPlugin, "Plugin cannot be null");
|
|
|
|
for (Map<Plugin, MetadataValue> values : metadataMap.values()) {
|
|
|
|
if (values.containsKey(owningPlugin)) {
|
|
|
|
--
|
2019-12-23 02:37:47 +00:00
|
|
|
2.24.1
|
2016-03-29 02:10:01 +00:00
|
|
|
|