Repository: karaf
Updated Branches:
  refs/heads/karaf-3.0.x 0c7e0f476 -> 4d4b28699


[KARAF-3885]Memory leak when use interactive client shell

(cherry picked from commit 9f58a1598f74c6a89b465e80bf8fbb6e2cd629ec)

Conflicts:
        
shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/4d4b2869
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/4d4b2869
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/4d4b2869

Branch: refs/heads/karaf-3.0.x
Commit: 4d4b28699349dc20c952a162c45a2998a66591e3
Parents: 0c7e0f4
Author: Freeman Fang <[email protected]>
Authored: Fri Aug 28 14:35:46 2015 +0800
Committer: Freeman Fang <[email protected]>
Committed: Fri Aug 28 14:39:06 2015 +0800

----------------------------------------------------------------------
 .../console/completer/CommandsCompleter.java      | 18 +++++++++++++++---
 .../shell/console/impl/jline/ConsoleImpl.java     |  6 ++++--
 2 files changed, 19 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/4d4b2869/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
index 6f57619..1229325 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/completer/CommandsCompleter.java
@@ -62,6 +62,7 @@ public class CommandsCompleter implements Completer {
     private final Map<String, Completer> globalCompleters = new 
HashMap<String, Completer>();
     private final Map<String, Completer> localCompleters = new HashMap<String, 
Completer>();
     private final Set<String> commands = new HashSet<String>();
+    private CommandTracker tracker;
 
     public CommandsCompleter() {
         this(CommandSessionHolder.getSession());
@@ -70,13 +71,18 @@ public class CommandsCompleter implements Completer {
     public CommandsCompleter(CommandSession session) {
         this.session = session;
         try {
-            new CommandTracker();
+            tracker = new CommandTracker();
         } catch (Throwable t) {
             // Ignore in case we're not in OSGi
         }
     }
 
-
+    public void dispose() {
+        if (tracker != null) {
+            tracker.dispose();
+        }
+    }
+    
     public int complete(String buffer, int cursor, List<String> candidates) {
         if (session == null) {
             session = CommandSessionHolder.getSession();
@@ -323,12 +329,13 @@ public class CommandsCompleter implements Completer {
     }
 
     private class CommandTracker {
+        private final ServiceListener listener;
         public CommandTracker() throws Exception {
             BundleContext context = 
FrameworkUtil.getBundle(getClass()).getBundleContext();
             if (context == null) {
                 throw new IllegalStateException("Bundle is stopped");
             }
-            ServiceListener listener = new ServiceListener() {
+            listener = new ServiceListener() {
                 public void serviceChanged(ServiceEvent event) {
                     synchronized (CommandsCompleter.this) {
                         commands.clear();
@@ -340,6 +347,11 @@ public class CommandsCompleter implements Completer {
                             CommandProcessor.COMMAND_SCOPE,
                             CommandProcessor.COMMAND_FUNCTION));
         }
+        
+        public void dispose() {
+            BundleContext context = 
FrameworkUtil.getBundle(getClass()).getBundleContext();
+            context.removeServiceListener(listener);
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/karaf/blob/4d4b2869/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
index 3b05a1b..5aa42d5 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/ConsoleImpl.java
@@ -74,6 +74,7 @@ public class ConsoleImpl implements Console {
     private boolean secured;
     private Thread thread;
     private final BundleContext bundleContext;
+    private CommandsCompleter completer;
 
     // logging
     private boolean consoleLogger = false;
@@ -139,7 +140,7 @@ public class ConsoleImpl implements Console {
 
         session.put(".jline.reader", reader);
         session.put(".jline.history", reader.getHistory());
-        Completer completer = createCompleter();
+        completer = createCompleter();
         if (completer != null) {
             reader.addCompleter(new CompleterAsCompletor(completer));
         }
@@ -181,6 +182,7 @@ public class ConsoleImpl implements Console {
         running = false;
         CommandSessionHolder.unset();
         pipe.interrupt();
+        completer.dispose();
         if (closedByUser && closeCallback != null) {
             closeCallback.run();
         }
@@ -369,7 +371,7 @@ public class ConsoleImpl implements Console {
         }
     }
 
-    protected Completer createCompleter() {
+    protected CommandsCompleter createCompleter() {
         return new CommandsCompleter(session);
     }
 

Reply via email to