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); }
