fix: ToolingServerListener is not released properly, resulting in memory leak

This commit is contained in:
Akash Yadav
2023-03-10 16:31:59 +05:30
parent daf39bc0a7
commit 36cf6d6d5e
3 changed files with 22 additions and 4 deletions
@@ -135,7 +135,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
override fun preDestroy() {
if (isDestroying) {
releaseServerListener()
this.initializingFuture?.cancel(true)
this.initializingFuture = null
@@ -254,6 +254,8 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
}
this.initializingFuture!!.whenCompleteAsync { result, error ->
releaseServerListener()
if (result == null || error != null) {
log.error("An error occurred initializing the project with Tooling API", error)
setStatus(getString(string.msg_project_initialization_failed))
@@ -264,6 +266,12 @@ abstract class ProjectHandlerActivity : BaseEditorActivity(), IProjectHandler {
}
}
private fun releaseServerListener() {
// Release reference to server listener in order to prevent memory leak
(Lookup.DEFAULT.lookup(BuildService.KEY_BUILD_SERVICE) as? GradleBuildService?)
?.setServerListener(null)
}
override fun stopLanguageServers() {
try {
destroyLanguageServers(isChangingConfigurations)
@@ -343,6 +343,12 @@ public class GradleBuildService extends Service implements BuildService, IToolin
return gradlew.exists() && gradleWrapperJar.exists() && gradleWrapperProps.exists();
}
public void setServerListener (@Nullable ToolingServerRunner.OnServerStartListener listener) {
if (this.toolingServerThread != null) {
this.toolingServerThread.setListener(listener);
}
}
private CompletableFuture<GradleWrapperCheckResult> installWrapper() {
if (eventListener != null) {
eventListener.onOutput("-------------------- NOTE --------------------");
@@ -478,7 +484,7 @@ public class GradleBuildService extends Service implements BuildService, IToolin
if (toolingServerThread.isStarted() && listener != null) {
listener.onServerStarted();
} else {
toolingServerThread.setListener(listener);
setServerListener(listener);
}
}
@@ -123,8 +123,12 @@ internal class ToolingServerRunner(
override fun interrupt() {
super.interrupt()
listener = null
observer = null
release()
}
internal fun release() {
this.listener = null
this.observer = null
}
interface Observer {