From 7968d012597b9f0425fa8ce63907e2c37050ab81 Mon Sep 17 00:00:00 2001 From: asofold Date: Sun, 2 Dec 2012 17:27:00 +0100 Subject: [PATCH] Improve ListenerManager cleanup. --- .../nocheatplus/event/GenericListener.java | 34 ++++++++++++++----- .../nocheatplus/event/ListenerManager.java | 8 ++++- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/fr/neatmonster/nocheatplus/event/GenericListener.java b/src/fr/neatmonster/nocheatplus/event/GenericListener.java index 017d65b8..dcfc880e 100644 --- a/src/fr/neatmonster/nocheatplus/event/GenericListener.java +++ b/src/fr/neatmonster/nocheatplus/event/GenericListener.java @@ -136,7 +136,8 @@ public class GenericListener implements Listener, EventExecutor public void addMethodEntry(final MethodEntry entry){ // TODO: maybe optimize later. - // MethodOrder: the new enties order will be compared versus the old entries tags, not the other way round !). + // MethodOrder: the new enties order will be compared versus the old entries tags, not the other way round !). + final MethodEntry[] entries = this.entries; int insertion = -1; if (entry.order != null){ if (entry.order.beforeTag != null){ @@ -156,12 +157,13 @@ public class GenericListener implements Listener, EventExecutor } } } + final MethodEntry[] newEntries; if (insertion == entries.length || insertion == -1){ - entries = Arrays.copyOf(entries, entries.length + 1); - entries[entries.length - 1] = entry; + newEntries = Arrays.copyOf(entries, entries.length + 1); + newEntries[entries.length - 1] = entry; } else{ - MethodEntry[] newEntries = new MethodEntry[entries.length + 1]; + newEntries = new MethodEntry[entries.length + 1]; for (int i = 0; i < entries.length + 1; i ++ ){ if (i < insertion) newEntries[i] = entries[i]; else if (i == insertion) newEntries[i] = entry; @@ -170,9 +172,9 @@ public class GenericListener implements Listener, EventExecutor newEntries[i] = entries[i - 1]; } } - entries = newEntries; } - + Arrays.fill(entries, null); + this.entries = newEntries; } /** @@ -180,13 +182,27 @@ public class GenericListener implements Listener, EventExecutor * @param listener */ public void remove(Listener listener) { - List keep = new ArrayList(entries.length); + final MethodEntry[] entries = this.entries; + final List keep = new ArrayList(entries.length); for (MethodEntry entry : entries){ if (entry.listener != listener) keep.add(entry); } if (keep.size() != entries.length){ - entries = new MethodEntry[keep.size()]; - keep.toArray(entries); + final MethodEntry[] newEntries = new MethodEntry[keep.size()]; + keep.toArray(newEntries); + Arrays.fill(entries, null); + this.entries = newEntries; + } + } + + /** + * Remove all MethodEntry references. + */ + public void clear() { + MethodEntry[] oldEntries = this.entries; + this.entries = new MethodEntry[0]; + for (int i = 0; i < oldEntries.length; i++){ + oldEntries[i] = null; } } } diff --git a/src/fr/neatmonster/nocheatplus/event/ListenerManager.java b/src/fr/neatmonster/nocheatplus/event/ListenerManager.java index 5284cc6b..eda76335 100644 --- a/src/fr/neatmonster/nocheatplus/event/ListenerManager.java +++ b/src/fr/neatmonster/nocheatplus/event/ListenerManager.java @@ -40,7 +40,8 @@ public class ListenerManager { } /** - * Probably put to protected later. + * Probably put to protected later.
+ * NOTE: Not thread-safe. * @param clazz * @param priority * @return @@ -89,6 +90,11 @@ public class ListenerManager { * Clear internal mappings. */ public void clear(){ + for (final Map> prioMap : map.values()){ + for (final GenericListener listener : prioMap.values()){ + listener.clear(); + } + } map.clear(); }