diff options
author | Wesley Wolfe <weswolf@aol.com> | 2012-10-07 15:08:21 -0500 |
---|---|---|
committer | Wesley Wolfe <weswolf@aol.com> | 2012-10-14 17:26:53 -0500 |
commit | 05e889f3468b07b2897d64ee1df3e26e763408b1 (patch) | |
tree | db61d53a6e329fbd5185bf2f2475fdf7aab3d5b0 /src/main/java/net/minecraft/server/ThreadLoginVerifier.java | |
parent | 93a79cd0e646318ee23db6842cbba0acb107c389 (diff) | |
download | craftbukkit-05e889f3468b07b2897d64ee1df3e26e763408b1.tar craftbukkit-05e889f3468b07b2897d64ee1df3e26e763408b1.tar.gz craftbukkit-05e889f3468b07b2897d64ee1df3e26e763408b1.tar.lz craftbukkit-05e889f3468b07b2897d64ee1df3e26e763408b1.tar.xz craftbukkit-05e889f3468b07b2897d64ee1df3e26e763408b1.zip |
Queue tasks from secondary threads. Fixes BUKKIT-2546 and BUKKIT-2600
This change affects the old chat compatibility layer from an
implementation only standpoint. It does not queue the 'event' to fire,
but rather queues a runnable that allows the calling thread to wait for
execution to finish.
The other effect of this change is that rcon connects now have their
commands queued to be run on next server tick using the same
implementation.
The internal implementation is in org.bukkit.craftbukkit.util.Waitable.
It is very similar to a Future<T> task, but only contains minimal
implementation with object.wait() and object.notify() calls
under the hood of waitable.get() and waitable.run().
PlayerPreLoginEvent now properly implements thread-safe event execution
by queuing the events similar to chat and rcon. This is still a poor way
albeit proper way to implement thread-safety; PlayerPreLoginEvent will
stay deprecated.
Diffstat (limited to 'src/main/java/net/minecraft/server/ThreadLoginVerifier.java')
-rw-r--r-- | src/main/java/net/minecraft/server/ThreadLoginVerifier.java | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java index dba7d42a..08a2703d 100644 --- a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java +++ b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java @@ -8,6 +8,7 @@ import java.net.URLEncoder; // CraftBukkit start import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.util.Waitable; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerPreLoginEvent; // CraftBukkit end @@ -46,15 +47,28 @@ class ThreadLoginVerifier extends Thread { AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(NetLoginHandler.d(this.netLoginHandler), this.netLoginHandler.getSocket().getInetAddress()); this.server.getPluginManager().callEvent(asyncEvent); - PlayerPreLoginEvent event = new PlayerPreLoginEvent(NetLoginHandler.d(this.netLoginHandler), this.netLoginHandler.getSocket().getInetAddress()); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); - } - this.server.getPluginManager().callEvent(event); + if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { + final PlayerPreLoginEvent event = new PlayerPreLoginEvent(NetLoginHandler.d(this.netLoginHandler), this.netLoginHandler.getSocket().getInetAddress()); + if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { + event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); + } + Waitable<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() { + @Override + protected PlayerPreLoginEvent.Result evaluate() { + ThreadLoginVerifier.this.server.getPluginManager().callEvent(event); + return event.getResult(); + }}; - if (event.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - this.netLoginHandler.disconnect(event.getKickMessage()); - return; + NetLoginHandler.b(this.netLoginHandler).processQueue.add(waitable); + if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { + this.netLoginHandler.disconnect(event.getKickMessage()); + return; + } + } else { + if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + this.netLoginHandler.disconnect(asyncEvent.getKickMessage()); + return; + } } // CraftBukkit end |