Fixes a deadlock issue in CraftScheduler

By: Raphfrk <raphfrk@gmail.com>
This commit is contained in:
CraftBukkit/Spigot 2011-02-13 03:45:34 +00:00
parent afd79ce40e
commit 85e1d48e88

View file

@ -20,6 +20,7 @@ public class CraftScheduler implements BukkitScheduler, Runnable {
private final CraftThreadManager craftThreadManager = new CraftThreadManager(); private final CraftThreadManager craftThreadManager = new CraftThreadManager();
private final LinkedList<Runnable> mainThreadQueue = new LinkedList<Runnable>(); private final LinkedList<Runnable> mainThreadQueue = new LinkedList<Runnable>();
private final LinkedList<Runnable> syncedTasks = new LinkedList<Runnable>();
private final TreeMap<CraftTask,Boolean> schedulerQueue = new TreeMap<CraftTask,Boolean>(); private final TreeMap<CraftTask,Boolean> schedulerQueue = new TreeMap<CraftTask,Boolean>();
@ -111,11 +112,14 @@ public class CraftScheduler implements BukkitScheduler, Runnable {
try { try {
this.currentTick = currentTick; this.currentTick = currentTick;
while (!mainThreadQueue.isEmpty()) { while (!mainThreadQueue.isEmpty()) {
mainThreadQueue.removeFirst().run(); syncedTasks.addLast(mainThreadQueue.removeFirst());
} }
} finally { } finally {
mainThreadLock.unlock(); mainThreadLock.unlock();
} }
while(!syncedTasks.isEmpty()) {
syncedTasks.removeFirst().run();
}
} }
} }