From cd8f9f5682fdee676610eb4670d17a9c043f18e9 Mon Sep 17 00:00:00 2001 From: Gaston Dombiak Date: Fri, 24 Sep 2004 20:40:51 +0000 Subject: [PATCH] Allows to remove a connection listener while notifying that the connection is being closed. SMACK-162 git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@2386 b35dd754-fafc-0310-a699-88a17e54d16e --- source/org/jivesoftware/smack/PacketReader.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/org/jivesoftware/smack/PacketReader.java b/source/org/jivesoftware/smack/PacketReader.java index 46d87c90a..d6a222863 100644 --- a/source/org/jivesoftware/smack/PacketReader.java +++ b/source/org/jivesoftware/smack/PacketReader.java @@ -202,8 +202,11 @@ class PacketReader { public void shutdown() { // Notify connection listeners of the connection closing if done hasn't already been set. if (!done) { + ArrayList listenersCopy; synchronized (connectionListeners) { - for (Iterator i=connectionListeners.iterator(); i.hasNext(); ) { + // Make a copy since it's possible that a listener will be removed from the list + listenersCopy = new ArrayList(connectionListeners); + for (Iterator i=listenersCopy.iterator(); i.hasNext(); ) { ConnectionListener listener = (ConnectionListener)i.next(); listener.connectionClosed(); } @@ -222,8 +225,11 @@ class PacketReader { done = true; connection.close(); // Notify connection listeners of the error. + ArrayList listenersCopy; synchronized (connectionListeners) { - for (Iterator i=connectionListeners.iterator(); i.hasNext(); ) { + // Make a copy since it's possible that a listener will be removed from the list + listenersCopy = new ArrayList(connectionListeners); + for (Iterator i=listenersCopy.iterator(); i.hasNext(); ) { ConnectionListener listener = (ConnectionListener)i.next(); listener.connectionClosedOnError(e); }