mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-02 04:56:50 +01:00
SPIGOT-4472: Add Consumer scheduler methods
This commit is contained in:
parent
f489f0f745
commit
ec937d0e07
4 changed files with 92 additions and 38 deletions
|
@ -7,9 +7,9 @@ class CraftAsyncDebugger {
|
|||
private CraftAsyncDebugger next = null;
|
||||
private final int expiry;
|
||||
private final Plugin plugin;
|
||||
private final Class<? extends Runnable> clazz;
|
||||
private final Class<?> clazz;
|
||||
|
||||
CraftAsyncDebugger(final int expiry, final Plugin plugin, final Class<? extends Runnable> clazz) {
|
||||
CraftAsyncDebugger(final int expiry, final Plugin plugin, final Class<?> clazz) {
|
||||
this.expiry = expiry;
|
||||
this.plugin = plugin;
|
||||
this.clazz = clazz;
|
||||
|
|
|
@ -13,7 +13,7 @@ class CraftAsyncTask extends CraftTask {
|
|||
private final LinkedList<BukkitWorker> workers = new LinkedList<BukkitWorker>();
|
||||
private final Map<Integer, CraftTask> runners;
|
||||
|
||||
CraftAsyncTask(final Map<Integer, CraftTask> runners, final Plugin plugin, final Runnable task, final int id, final long delay) {
|
||||
CraftAsyncTask(final Map<Integer, CraftTask> runners, final Plugin plugin, final Object task, final int id, final long delay) {
|
||||
super(plugin, task, id, delay);
|
||||
this.runners = runners;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ import java.util.concurrent.Executors;
|
|||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.apache.commons.lang.Validate;
|
||||
|
@ -88,45 +89,89 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
RECENT_TICKS = 30;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int scheduleSyncDelayedTask(final Plugin plugin, final Runnable task) {
|
||||
return this.scheduleSyncDelayedTask(plugin, task, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTask(Plugin plugin, Runnable runnable) {
|
||||
return runTaskLater(plugin, runnable, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTask(Plugin plugin, Consumer<BukkitTask> task) throws IllegalArgumentException {
|
||||
runTaskLater(plugin, task, 0L);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public int scheduleAsyncDelayedTask(final Plugin plugin, final Runnable task) {
|
||||
return this.scheduleAsyncDelayedTask(plugin, task, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTaskAsynchronously(Plugin plugin, Runnable runnable) {
|
||||
return runTaskLaterAsynchronously(plugin, runnable, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTaskAsynchronously(Plugin plugin, Consumer<BukkitTask> task) throws IllegalArgumentException {
|
||||
runTaskLaterAsynchronously(plugin, task, 0L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int scheduleSyncDelayedTask(final Plugin plugin, final Runnable task, final long delay) {
|
||||
return this.scheduleSyncRepeatingTask(plugin, task, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTaskLater(Plugin plugin, Runnable runnable, long delay) {
|
||||
return runTaskTimer(plugin, runnable, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTaskLater(Plugin plugin, Consumer<BukkitTask> task, long delay) throws IllegalArgumentException {
|
||||
runTaskTimer(plugin, task, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public int scheduleAsyncDelayedTask(final Plugin plugin, final Runnable task, final long delay) {
|
||||
return this.scheduleAsyncRepeatingTask(plugin, task, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTaskLaterAsynchronously(Plugin plugin, Runnable runnable, long delay) {
|
||||
return runTaskTimerAsynchronously(plugin, runnable, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTaskLaterAsynchronously(Plugin plugin, Consumer<BukkitTask> task, long delay) throws IllegalArgumentException {
|
||||
runTaskTimerAsynchronously(plugin, task, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTaskTimerAsynchronously(Plugin plugin, Consumer<BukkitTask> task, long delay, long period) throws IllegalArgumentException {
|
||||
runTaskTimerAsynchronously(plugin, (Object) task, delay, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int scheduleSyncRepeatingTask(final Plugin plugin, final Runnable runnable, long delay, long period) {
|
||||
return runTaskTimer(plugin, runnable, delay, period).getTaskId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTaskTimer(Plugin plugin, Runnable runnable, long delay, long period) {
|
||||
return runTaskTimer(plugin, (Object) runnable, delay, period);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void runTaskTimer(Plugin plugin, Consumer<BukkitTask> task, long delay, long period) throws IllegalArgumentException {
|
||||
runTaskTimer(plugin, (Object) task, delay, period);
|
||||
}
|
||||
|
||||
public BukkitTask runTaskTimer(Plugin plugin, Object runnable, long delay, long period) {
|
||||
validate(plugin, runnable);
|
||||
if (delay < 0L) {
|
||||
delay = 0;
|
||||
|
@ -140,11 +185,17 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
}
|
||||
|
||||
@Deprecated
|
||||
@Override
|
||||
public int scheduleAsyncRepeatingTask(final Plugin plugin, final Runnable runnable, long delay, long period) {
|
||||
return runTaskTimerAsynchronously(plugin, runnable, delay, period).getTaskId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BukkitTask runTaskTimerAsynchronously(Plugin plugin, Runnable runnable, long delay, long period) {
|
||||
return runTaskTimerAsynchronously(plugin, (Object) runnable, delay, period);
|
||||
}
|
||||
|
||||
public BukkitTask runTaskTimerAsynchronously(Plugin plugin, Object runnable, long delay, long period) {
|
||||
validate(plugin, runnable);
|
||||
if (delay < 0L) {
|
||||
delay = 0;
|
||||
|
@ -157,6 +208,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
return handle(new CraftAsyncTask(runners, plugin, runnable, nextId(), period), delay);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Future<T> callSyncMethod(final Plugin plugin, final Callable<T> task) {
|
||||
validate(plugin, task);
|
||||
final CraftFuture<T> future = new CraftFuture<T>(task, plugin, nextId());
|
||||
|
@ -164,6 +216,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
return future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelTask(final int taskId) {
|
||||
if (taskId <= 0) {
|
||||
return;
|
||||
|
@ -205,6 +258,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancelTasks(final Plugin plugin) {
|
||||
Validate.notNull(plugin, "Cannot cancel tasks of null plugin");
|
||||
final CraftTask task = new CraftTask(
|
||||
|
@ -243,34 +297,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
}
|
||||
}
|
||||
|
||||
public void cancelAllTasks() {
|
||||
final CraftTask task = new CraftTask(
|
||||
new Runnable() {
|
||||
public void run() {
|
||||
Iterator<CraftTask> it = CraftScheduler.this.runners.values().iterator();
|
||||
while (it.hasNext()) {
|
||||
CraftTask task = it.next();
|
||||
task.cancel0();
|
||||
if (task.isSync()) {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
CraftScheduler.this.pending.clear();
|
||||
CraftScheduler.this.temp.clear();
|
||||
}
|
||||
});
|
||||
handle(task, 0L);
|
||||
for (CraftTask taskPending = head.getNext(); taskPending != null; taskPending = taskPending.getNext()) {
|
||||
if (taskPending == task) {
|
||||
break;
|
||||
}
|
||||
taskPending.cancel0();
|
||||
}
|
||||
for (CraftTask runner : runners.values()) {
|
||||
runner.cancel0();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCurrentlyRunning(final int taskId) {
|
||||
final CraftTask task = runners.get(taskId);
|
||||
if (task == null) {
|
||||
|
@ -285,6 +312,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isQueued(final int taskId) {
|
||||
if (taskId <= 0) {
|
||||
return false;
|
||||
|
@ -298,6 +326,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
return task != null && task.getPeriod() >= CraftTask.NO_REPEATING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BukkitWorker> getActiveWorkers() {
|
||||
final ArrayList<BukkitWorker> workers = new ArrayList<BukkitWorker>();
|
||||
for (final CraftTask taskObj : runners.values()) {
|
||||
|
@ -314,6 +343,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
return workers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BukkitTask> getPendingTasks() {
|
||||
final ArrayList<CraftTask> truePending = new ArrayList<CraftTask>();
|
||||
for (CraftTask task = head.getNext(); task != null; task = task.getNext()) {
|
||||
|
@ -407,6 +437,7 @@ public class CraftScheduler implements BukkitScheduler {
|
|||
private static void validate(final Plugin plugin, final Object task) {
|
||||
Validate.notNull(plugin, "Plugin cannot be null");
|
||||
Validate.notNull(task, "Task cannot be null");
|
||||
Validate.isTrue(task instanceof Runnable || task instanceof Consumer, "Task must be Runnable or Consumer");
|
||||
if (!plugin.isEnabled()) {
|
||||
throw new IllegalPluginAccessException("Plugin attempted to register task while disabled");
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.bukkit.craftbukkit.scheduler;
|
||||
|
||||
import java.util.function.Consumer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
@ -23,7 +24,8 @@ class CraftTask implements BukkitTask, Runnable {
|
|||
*/
|
||||
private volatile long period;
|
||||
private long nextRun;
|
||||
private final Runnable task;
|
||||
private final Runnable rTask;
|
||||
private final Consumer<BukkitTask> cTask;
|
||||
private final Plugin plugin;
|
||||
private final int id;
|
||||
|
||||
|
@ -31,31 +33,51 @@ class CraftTask implements BukkitTask, Runnable {
|
|||
this(null, null, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
CraftTask(final Runnable task) {
|
||||
CraftTask(final Object task) {
|
||||
this(null, task, CraftTask.NO_REPEATING, CraftTask.NO_REPEATING);
|
||||
}
|
||||
|
||||
CraftTask(final Plugin plugin, final Runnable task, final int id, final long period) {
|
||||
CraftTask(final Plugin plugin, final Object task, final int id, final long period) {
|
||||
this.plugin = plugin;
|
||||
this.task = task;
|
||||
if (task instanceof Runnable) {
|
||||
this.rTask = (Runnable) task;
|
||||
this.cTask = null;
|
||||
} else if (task instanceof Consumer) {
|
||||
this.cTask = (Consumer<BukkitTask>) task;
|
||||
this.rTask = null;
|
||||
} else if (task == null) {
|
||||
// Head task
|
||||
this.rTask = null;
|
||||
this.cTask = null;
|
||||
} else {
|
||||
throw new AssertionError("Illegal task class " + task);
|
||||
}
|
||||
this.id = id;
|
||||
this.period = period;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final int getTaskId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final Plugin getOwner() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSync() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
task.run();
|
||||
if (rTask != null) {
|
||||
rTask.run();
|
||||
} else {
|
||||
cTask.accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
long getPeriod() {
|
||||
|
@ -82,8 +104,8 @@ class CraftTask implements BukkitTask, Runnable {
|
|||
this.next = next;
|
||||
}
|
||||
|
||||
Class<? extends Runnable> getTaskClass() {
|
||||
return task.getClass();
|
||||
Class<?> getTaskClass() {
|
||||
return (rTask != null) ? rTask.getClass() : cTask.getClass();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -91,6 +113,7 @@ class CraftTask implements BukkitTask, Runnable {
|
|||
return (period == CraftTask.CANCEL);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
Bukkit.getScheduler().cancelTask(id);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue