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