From 93521af608fc836cc631677cd8f78f4c835483f4 Mon Sep 17 00:00:00 2001 From: TomyLobo Date: Tue, 28 Feb 2012 19:37:27 -0600 Subject: Event system optimizations. Addresses BUKKIT-813 - Made the handlers field a simple array instead of an array of arrays. - Got rid of the "baked" field. --- .../bukkit/command/defaults/TimingsCommand.java | 8 ++-- src/main/java/org/bukkit/event/HandlerList.java | 34 ++++++---------- .../org/bukkit/plugin/SimplePluginManager.java | 47 ++++++++++------------ 3 files changed, 38 insertions(+), 51 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/bukkit/command/defaults/TimingsCommand.java b/src/main/java/org/bukkit/command/defaults/TimingsCommand.java index b6c9a663..f4da879b 100644 --- a/src/main/java/org/bukkit/command/defaults/TimingsCommand.java +++ b/src/main/java/org/bukkit/command/defaults/TimingsCommand.java @@ -37,11 +37,9 @@ public class TimingsCommand extends Command { boolean separate = "separate".equals(args[0]); if ("reset".equals(args[0])) { for (HandlerList handlerList : HandlerList.getHandlerLists()) { - for (RegisteredListener[] listeners : handlerList.getRegisteredListeners()) { - for (RegisteredListener listener : listeners) { - if (listener instanceof TimedRegisteredListener) { - ((TimedRegisteredListener)listener).reset(); - } + for (RegisteredListener listener : handlerList.getRegisteredListeners()) { + if (listener instanceof TimedRegisteredListener) { + ((TimedRegisteredListener)listener).reset(); } } } diff --git a/src/main/java/org/bukkit/event/HandlerList.java b/src/main/java/org/bukkit/event/HandlerList.java index 5e0bfb02..f25b26fb 100644 --- a/src/main/java/org/bukkit/event/HandlerList.java +++ b/src/main/java/org/bukkit/event/HandlerList.java @@ -14,7 +14,7 @@ public class HandlerList { /** * Handler array. This field being an array is the key to this system's speed. */ - private RegisteredListener[][] handlers = new RegisteredListener[EventPriority.values().length][]; + private RegisteredListener[] handlers = null; /** * Dynamic handler lists. These are changed using register() and @@ -23,15 +23,6 @@ public class HandlerList { */ private final EnumMap> handlerslots; - /** - * Whether the current HandlerList has been fully baked. When this is set - * to false, the Map> will be baked to RegisteredListener[][] - * next time the event is called. - * - * @see org.bukkit.plugin.SimplePluginManager#callEvent - */ - private boolean baked = false; - /** * List of all HandlerLists which have been created, for use in bakeAll() */ @@ -56,7 +47,7 @@ public class HandlerList { for (List list : h.handlerslots.values()) { list.clear(); } - h.baked = false; + h.handlers = null; } } @@ -102,7 +93,7 @@ public class HandlerList { public void register(RegisteredListener listener) { if (handlerslots.get(listener.getPriority()).contains(listener)) throw new IllegalStateException("This listener is already registered to priority " + listener.getPriority().toString()); - baked = false; + handlers = null; handlerslots.get(listener.getPriority()).add(listener); } @@ -123,9 +114,8 @@ public class HandlerList { * @param listener listener to remove */ public void unregister(RegisteredListener listener) { - if (handlerslots.get(listener.getPriority()).contains(listener)) { - baked = false; - handlerslots.get(listener.getPriority()).remove(listener); + if (handlerslots.get(listener.getPriority()).remove(listener)) { + handlers = null; } } @@ -144,7 +134,7 @@ public class HandlerList { } } } - if (changed) baked = false; + if (changed) handlers = null; } /** @@ -162,18 +152,19 @@ public class HandlerList { } } } - if (changed) baked = false; + if (changed) handlers = null; } /** * Bake HashMap and ArrayLists to 2d array - does nothing if not necessary */ public void bake() { - if (baked) return; // don't re-bake when still valid + if (handlers != null) return; // don't re-bake when still valid + List entries = new ArrayList(); for (Entry> entry : handlerslots.entrySet()) { - handlers[entry.getKey().getSlot()] = (entry.getValue().toArray(new RegisteredListener[entry.getValue().size()])); + entries.addAll(entry.getValue()); } - baked = true; + handlers = entries.toArray(new RegisteredListener[entries.size()]); } /** @@ -181,7 +172,8 @@ public class HandlerList { * * @return the array of registered listeners */ - public RegisteredListener[][] getRegisteredListeners() { + public RegisteredListener[] getRegisteredListeners() { + bake(); return handlers; } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java index 621a3cd1..1febcb8c 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -431,38 +431,35 @@ public final class SimplePluginManager implements PluginManager { */ public synchronized void callEvent(Event event) { HandlerList handlers = event.getHandlers(); - handlers.bake(); - RegisteredListener[][] listeners = handlers.getRegisteredListeners(); + RegisteredListener[] listeners = handlers.getRegisteredListeners(); - for (int i = 0; i < listeners.length; i++) { - for (RegisteredListener registration : listeners[i]) { - if (!registration.getPlugin().isEnabled()) { - continue; - } + for (RegisteredListener registration : listeners) { + if (!registration.getPlugin().isEnabled()) { + continue; + } - try { - registration.callEvent(event); - } catch (AuthorNagException ex) { - Plugin plugin = registration.getPlugin(); + try { + registration.callEvent(event); + } catch (AuthorNagException ex) { + Plugin plugin = registration.getPlugin(); - if (plugin.isNaggable()) { - plugin.setNaggable(false); + if (plugin.isNaggable()) { + plugin.setNaggable(false); - String author = ""; + String author = ""; - if (plugin.getDescription().getAuthors().size() > 0) { - author = plugin.getDescription().getAuthors().get(0); - } - server.getLogger().log(Level.SEVERE, String.format( - "Nag author: '%s' of '%s' about the following: %s", - author, - plugin.getDescription().getName(), - ex.getMessage() - )); + if (plugin.getDescription().getAuthors().size() > 0) { + author = plugin.getDescription().getAuthors().get(0); } - } catch (Throwable ex) { - server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getName(), ex); + server.getLogger().log(Level.SEVERE, String.format( + "Nag author: '%s' of '%s' about the following: %s", + author, + plugin.getDescription().getName(), + ex.getMessage() + )); } + } catch (Throwable ex) { + server.getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getName(), ex); } } } -- cgit v1.2.3