Synchronise access to the PriorityQueue used for effect queuing in AbstractWorld

- Makes it thread-safe
This commit is contained in:
dordsor21 2022-01-15 17:09:49 +00:00
parent 0ccae19ded
commit d3696f91d4
No known key found for this signature in database
GPG Key ID: 1E53E88969FFCF0B

View File

@ -111,14 +111,18 @@ public abstract class AbstractWorld implements World {
public boolean queueBlockBreakEffect(Platform server, BlockVector3 position, BlockType blockType, double priority) { public boolean queueBlockBreakEffect(Platform server, BlockVector3 position, BlockType blockType, double priority) {
if (taskId == -1) { if (taskId == -1) {
taskId = server.schedule(0, 1, () -> { taskId = server.schedule(0, 1, () -> {
int max = Math.max(1, Math.min(30, effectQueue.size() / 3)); //FAWE start - access to PriorityQueue is not thread-safe
for (int i = 0; i < max; ++i) { synchronized (effectQueue) {
if (effectQueue.isEmpty()) { int max = Math.max(1, Math.min(30, effectQueue.size() / 3));
return; for (int i = 0; i < max; ++i) {
} if (effectQueue.isEmpty()) {
return;
}
effectQueue.poll().play(); effectQueue.poll().play();
}
} }
//FAWE end
}); });
} }
@ -126,7 +130,11 @@ public abstract class AbstractWorld implements World {
return false; return false;
} }
effectQueue.offer(new QueuedEffect(position.toVector3(), blockType, priority)); //FAWE start - access to PriorityQueue is not thread-safe
synchronized (effectQueue) {
effectQueue.offer(new QueuedEffect(position.toVector3(), blockType, priority));
}
//FAWE end
return true; return true;
} }