diff --git a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java index 1eb8f7b396d..1e7d3ca66b8 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/dstore/universal/miners/UniversalFileSystemMiner.java @@ -43,6 +43,7 @@ * David McKnight (IBM) - [283617] [dstore] UniversalFileSystemMiner.handleQueryGetRemoteObject does not return correct result when the queried file does not exist. * David McKnight (IBM) - [dstore] cancelable threads not removed fast enough from Hashmap, resulting in OOM * David McKnight (IBM) - [371401] [dstore][multithread] avoid use of static variables - causes memory leak after disconnect + * Noriaki Takatsu (IBM) - [380562] [multithread][dstore] File Search is not canceled by the client UI on disconnect *******************************************************************************/ package org.eclipse.rse.dstore.universal.miners; @@ -54,6 +55,7 @@ import java.net.ServerSocket; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; import org.eclipse.dstore.core.miners.Miner; @@ -1362,7 +1364,26 @@ public class UniversalFileSystemMiner extends Miner { } public void finish() { - _cancellableThreads.clear(); + try { + if (_cancellableThreads != null) { + Set keys = _cancellableThreads.keySet(); + Iterator iteratorKeys = keys.iterator(); + while (iteratorKeys.hasNext()) { + Object key = iteratorKeys.next(); + ICancellableHandler thread = (ICancellableHandler) _cancellableThreads.get(key); + if (thread != null) { + if (!thread.isDone()) { + thread.cancel(); + } + } + } + + _cancellableThreads.clear(); + } + } + catch(Throwable e) { + e.printStackTrace(); + } super.finish(); } diff --git a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/UniversalSearchHandler.java b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/UniversalSearchHandler.java index c489bdc54eb..f817f17c044 100644 --- a/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/UniversalSearchHandler.java +++ b/rse/plugins/org.eclipse.rse.services.dstore/miners/org/eclipse/rse/internal/dstore/universal/miners/filesystem/UniversalSearchHandler.java @@ -29,6 +29,7 @@ * David McKnight (IBM) - [358301] [DSTORE] Hang during debug source look up * Noriaki Takatsu (IBM) - [362025] [dstore] Search for text hung in encountering a device definition * David McKnight (IBM) - [371401] [dstore][multithread] avoid use of static variables - causes memory leak after disconnect + * Noriaki Takatsu (IBM) - [380562] [multithread][dstore] File Search is not canceled by the client UI on disconnect ********************************************************************************/ package org.eclipse.rse.internal.dstore.universal.miners.filesystem; @@ -406,7 +407,7 @@ public class UniversalSearchHandler extends SecuredThread implements ICancellabl long MAX_READ = MAX_FILE / 10; // read no more than a tenth of max file at a time int offset = 0; - while (offset < fileLength && !matched){ + while (offset < fileLength && !matched && !_isCancelled){ long readSize = MAX_READ; if (offset + MAX_READ > fileLength){ readSize = fileLength - offset;