Add more thread-safety checks
This commit is contained in:
parent
c7e0f64469
commit
777b696f38
|
@ -39,7 +39,6 @@ class DefaultHolographicDisplaysAPI implements HolographicDisplaysAPI {
|
|||
public @NotNull Hologram createHologram(@NotNull Location location) {
|
||||
Preconditions.notNull(location, "location");
|
||||
Preconditions.notNull(location.getWorld(), "location.getWorld()");
|
||||
Preconditions.checkMainThread("async hologram creation");
|
||||
|
||||
return apiHologramManager.createHologram(ImmutablePosition.of(location), plugin);
|
||||
}
|
||||
|
@ -48,7 +47,6 @@ class DefaultHolographicDisplaysAPI implements HolographicDisplaysAPI {
|
|||
public @NotNull Hologram createHologram(@NotNull Position position) {
|
||||
Preconditions.notNull(position, "position");
|
||||
Preconditions.notNull(position.getWorldName(), "position.getWorldName()");
|
||||
Preconditions.checkMainThread("async hologram creation");
|
||||
|
||||
return apiHologramManager.createHologram(ImmutablePosition.of(position), plugin);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,6 @@ public class V2HologramsAPIProvider extends HologramsAPIProvider {
|
|||
Preconditions.notNull(plugin, "plugin");
|
||||
Preconditions.notNull(source, "source");
|
||||
Preconditions.notNull(source.getWorld(), "source.getWorld()");
|
||||
Preconditions.checkMainThread("async hologram creation");
|
||||
|
||||
return hologramManager.createHologram(ImmutablePosition.of(source), plugin);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
package me.filoghost.holographicdisplays.core.base;
|
||||
|
||||
import me.filoghost.fcommons.Preconditions;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.World;
|
||||
|
||||
|
@ -20,6 +21,8 @@ public abstract class BaseHologramManager<H extends BaseHologram> {
|
|||
private final List<H> unmodifiableHologramsView = Collections.unmodifiableList(holograms);
|
||||
|
||||
protected void addHologram(H hologram) {
|
||||
Preconditions.checkMainThread("async hologram create");
|
||||
|
||||
holograms.add(hologram);
|
||||
}
|
||||
|
||||
|
@ -28,11 +31,15 @@ public abstract class BaseHologramManager<H extends BaseHologram> {
|
|||
}
|
||||
|
||||
public void deleteHologram(H hologram) {
|
||||
Preconditions.checkMainThread("async hologram delete");
|
||||
|
||||
hologram.setDeleted();
|
||||
holograms.remove(hologram);
|
||||
}
|
||||
|
||||
public void deleteHologramsIf(Predicate<H> condition) {
|
||||
Preconditions.checkMainThread("async hologram delete");
|
||||
|
||||
Iterator<H> iterator = holograms.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
H hologram = iterator.next();
|
||||
|
@ -44,6 +51,8 @@ public abstract class BaseHologramManager<H extends BaseHologram> {
|
|||
}
|
||||
|
||||
public void deleteHolograms() {
|
||||
Preconditions.checkMainThread("async hologram delete");
|
||||
|
||||
Iterator<H> iterator = holograms.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
H hologram = iterator.next();
|
||||
|
|
|
@ -48,6 +48,16 @@ public class ChunkListener implements Listener {
|
|||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onChunkUnload(ChunkUnloadEvent event) {
|
||||
Chunk chunk = event.getChunk();
|
||||
|
||||
// Always execute on the main thread
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
onChunkUnload(chunk);
|
||||
} else {
|
||||
Bukkit.getScheduler().runTask(plugin, () -> onChunkUnload(chunk));
|
||||
}
|
||||
}
|
||||
|
||||
private void onChunkUnload(Chunk chunk) {
|
||||
apiHologramManager.onChunkUnload(chunk);
|
||||
v2HologramManager.onChunkUnload(chunk);
|
||||
}
|
||||
|
@ -61,7 +71,7 @@ public class ChunkListener implements Listener {
|
|||
return;
|
||||
}
|
||||
|
||||
// In case another plugin loads the chunk asynchronously, always make sure to load the holograms on the main thread
|
||||
// Always execute on the main thread
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
onChunkLoad(chunk);
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue