diff options
Diffstat (limited to 'providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java')
-rw-r--r-- | providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java index 9aae0dc5e..a95d76d8d 100644 --- a/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java +++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer.httpclient4/src/org/eclipse/ecf/internal/provider/filetransfer/httpclient4/ConnectingSocketMonitor.java @@ -11,8 +11,19 @@ package org.eclipse.ecf.internal.provider.filetransfer.httpclient4; -import java.util.*; -import org.eclipse.ecf.filetransfer.events.socket.*; +import java.io.IOException; +import java.net.Socket; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import org.eclipse.ecf.core.util.Trace; +import org.eclipse.ecf.filetransfer.events.socket.ISocketClosedEvent; +import org.eclipse.ecf.filetransfer.events.socket.ISocketConnectedEvent; +import org.eclipse.ecf.filetransfer.events.socket.ISocketCreatedEvent; +import org.eclipse.ecf.filetransfer.events.socket.ISocketEvent; +import org.eclipse.ecf.filetransfer.events.socket.ISocketListener; public class ConnectingSocketMonitor implements ISocketListener { @@ -26,6 +37,16 @@ public class ConnectingSocketMonitor implements ISocketListener { connectingSockets = Collections.synchronizedMap(new HashMap()); } + /** + * Callers of this method should not iterate through the returned + * Collection, as a CME is possible...as reported by bug + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=430704 + * Rather than call this method and iterate through the Collection, + * to close the connecting sockets call closeConnectingSockets + * instead. + * @return Collection the existing collection of underlying connecting + * Socket instances + */ public Collection getConnectingSockets() { return Collections.unmodifiableCollection(connectingSockets.keySet()); } @@ -34,6 +55,28 @@ public class ConnectingSocketMonitor implements ISocketListener { connectingSockets.clear(); } + /** + * Method added to synchronize access to underlying keySet + * to prevent CME as reported in bug + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=430704 + */ + public void closeSockets() { + // synchronize on the connectingSockets map + // so all changes caused by handleSocketEvent + // are prevented via synchronized Map + synchronized (connectingSockets) { + for (Iterator iterator = connectingSockets.keySet().iterator(); iterator.hasNext();) { + Socket socket = (Socket) iterator.next(); + try { + Trace.trace(Activator.PLUGIN_ID, "Call socket.close() for socket=" + socket.toString()); //$NON-NLS-1$ + socket.close(); + } catch (IOException e) { + Trace.catching(Activator.PLUGIN_ID, DebugOptions.EXCEPTIONS_CATCHING, this.getClass(), "cancel", e); //$NON-NLS-1$ + } + } + } + } + public void handleSocketEvent(ISocketEvent event) { if (event instanceof ISocketCreatedEvent) { connectingSockets.put(event.getFactorySocket(), event); |