From 49df44ad6c4625301b32762d059936c0aeb42d25 Mon Sep 17 00:00:00 2001 From: EvilSeph Date: Thu, 30 Jun 2011 02:18:11 -0400 Subject: [PATCH] Possible fix for cancelled CraftScheduler tasks still running. --- .../craftbukkit/scheduler/CraftScheduler.java | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java index d2cd7ad094..020669097c 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java +++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java @@ -253,15 +253,40 @@ public class CraftScheduler implements BukkitScheduler, Runnable { } public void cancelTask(int taskId) { - synchronized (schedulerQueue) { - Iterator itr = schedulerQueue.keySet().iterator(); - while (itr.hasNext()) { - CraftTask current = itr.next(); - if (current.getIdNumber() == taskId) { - itr.remove(); + syncedTasksLock.lock(); + try { + synchronized (schedulerQueue) { + mainThreadLock.lock(); + try { + Iterator itr = schedulerQueue.keySet().iterator(); + while (itr.hasNext()) { + CraftTask current = itr.next(); + if (current.getIdNumber() == taskId) { + itr.remove(); + } + } + itr = mainThreadQueue.iterator(); + while (itr.hasNext()) { + CraftTask current = itr.next(); + if (current.getIdNumber() == taskId) { + itr.remove(); + } + } + itr = syncedTasks.iterator(); + while (itr.hasNext()) { + CraftTask current = itr.next(); + if (current.getIdNumber() == taskId) { + itr.remove(); + } + } + } finally { + mainThreadLock.unlock(); } } + } finally { + syncedTasksLock.unlock(); } + craftThreadManager.interruptTask(taskId); }