Repository: karaf
Updated Branches:
  refs/heads/karaf-2.x 7e332da64 -> 9f58a1598


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


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

Branch: refs/heads/karaf-2.x
Commit: 9f58a1598f74c6a89b465e80bf8fbb6e2cd629ec
Parents: 7e332da
Author: Freeman Fang <[email protected]>
Authored: Fri Aug 28 14:35:46 2015 +0800
Committer: Freeman Fang <[email protected]>
Committed: Fri Aug 28 14:35:46 2015 +0800

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


http://git-wip-us.apache.org/repos/asf/karaf/blob/9f58a159/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 bed1148..a269913 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
@@ -52,6 +52,7 @@ public class CommandsCompleter implements Completer {
     private CommandSession session;
     private final List<Completer> completers = new ArrayList<Completer>();
     private final Set<String> commands = new HashSet<String>();
+    private CommandTracker tracker;
 
     public CommandsCompleter() {
         this(CommandSessionHolder.getSession());
@@ -60,13 +61,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();
@@ -162,12 +168,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();
@@ -179,6 +186,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/9f58a159/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
----------------------------------------------------------------------
diff --git 
a/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java 
b/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
index 4828557..df20ccd 100644
--- 
a/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
+++ 
b/shell/console/src/main/java/org/apache/karaf/shell/console/jline/Console.java
@@ -83,6 +83,7 @@ public class Console implements Runnable
     private PrintStream err;
     private Thread thread;
     private final BundleContext bundleContext;
+    private CommandsCompleter completer;
 
     public Console(CommandProcessor processor,
                    ThreadIO threadIO,
@@ -130,7 +131,7 @@ public class Console implements Runnable
 
         session.put(".jline.reader", reader);
         session.put(".jline.history", reader.getHistory());
-        Completer completer = createCompleter();
+        completer = createCompleter();
         if (completer != null) {
             reader.addCompleter(new CompleterAsCompletor(completer));
         }
@@ -169,6 +170,7 @@ public class Console implements Runnable
         pipe.interrupt();
         thread.interrupt();
         reader.shutdown();
+        completer.dispose();
         if (closedByUser && closeCallback != null) {
             closeCallback.run();
         }
@@ -370,7 +372,7 @@ public class Console implements Runnable
         }
     }
 
-    protected Completer createCompleter() {
+    protected CommandsCompleter createCompleter() {
         return new CommandsCompleter(session);
     }
 

Reply via email to