mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Multi-Launch: Add ReentrantReadWriteLock for sessions
GitOrigin-RevId: 476498bb5fb475c10fb96f724b1f77f70333a2c5
This commit is contained in:
committed by
intellij-monorepo-bot
parent
a11a6e9e7f
commit
eaae03c01c
+29
-19
@@ -2,7 +2,6 @@ package com.intellij.execution.multilaunch.execution
|
||||
|
||||
import com.intellij.execution.CantRunException
|
||||
import com.intellij.execution.ExecutionBundle
|
||||
import com.intellij.execution.multilaunch.execution.*
|
||||
import com.intellij.openapi.components.Service
|
||||
import com.intellij.openapi.components.service
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -19,6 +18,9 @@ import com.intellij.execution.multilaunch.execution.messaging.ExecutionEventsBus
|
||||
import com.intellij.execution.multilaunch.execution.messaging.ExecutionNotifier
|
||||
import com.intellij.execution.multilaunch.servicesView.MultiLaunchServicesRefresher
|
||||
import com.intellij.openapi.rd.util.lifetime
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import kotlin.concurrent.read
|
||||
import kotlin.concurrent.write
|
||||
|
||||
@Service(Service.Level.PROJECT)
|
||||
class ExecutionEngine(private val project: Project) {
|
||||
@@ -30,19 +32,7 @@ class ExecutionEngine(private val project: Project) {
|
||||
private val publisher by lazy { eventBus.createPublisher() }
|
||||
private val executionModel by lazy { ExecutionModel.getInstance(project) }
|
||||
private val serviceViewUpdatePublisher by lazy { MultiLaunchServicesRefresher.getInstance(project) }
|
||||
|
||||
private var activeSessions = mutableMapOf<MultiLaunchConfiguration, ExecutionSession>()
|
||||
|
||||
fun getActiveSession(configuration: MultiLaunchConfiguration): ExecutionSession? {
|
||||
return activeSessions[configuration]
|
||||
}
|
||||
|
||||
private fun setActiveSession(configuration: MultiLaunchConfiguration, session: ExecutionSession?) {
|
||||
when (session) {
|
||||
null -> activeSessions.remove(configuration)
|
||||
else -> activeSessions.put(configuration, session)
|
||||
}
|
||||
}
|
||||
private val sessionManager by lazy { ExecutionSessionManager() }
|
||||
|
||||
fun initialize() {
|
||||
eventBus.subscribe(StatusListener(), project.lifetime)
|
||||
@@ -68,10 +58,10 @@ class ExecutionEngine(private val project: Project) {
|
||||
val configurationModel = executionModel.configurations[configuration] ?: throw CantRunException(
|
||||
ExecutionBundle.message("run.configurations.multilaunch.error.configuration.doesnt.exist"))
|
||||
|
||||
getActiveSession(configuration)?.stop()
|
||||
stop(configuration)
|
||||
|
||||
val session = ExecutionSession(project, configurationModel)
|
||||
setActiveSession(configuration, session)
|
||||
sessionManager.setActiveSession(configuration, session)
|
||||
|
||||
markNotStarted(session, configurationModel)
|
||||
createConditionListeners(session, configurationModel, eventBus, executionMode)
|
||||
@@ -81,12 +71,12 @@ class ExecutionEngine(private val project: Project) {
|
||||
}
|
||||
|
||||
fun stop(configuration: MultiLaunchConfiguration) {
|
||||
val session = getActiveSession(configuration) ?: return
|
||||
val session = sessionManager.getActiveSession(configuration) ?: return
|
||||
session.stop()
|
||||
}
|
||||
|
||||
fun stop(configuration: MultiLaunchConfiguration, executable: Executable) {
|
||||
val session = getActiveSession(configuration) ?: return
|
||||
val session = sessionManager.getActiveSession(configuration) ?: return
|
||||
session.stop(executable)
|
||||
}
|
||||
|
||||
@@ -179,7 +169,7 @@ class ExecutionEngine(private val project: Project) {
|
||||
}
|
||||
|
||||
override fun afterExecute(configuration: MultiLaunchConfiguration, executable: Executable) {
|
||||
val session = getActiveSession(configuration) ?: return
|
||||
val session = sessionManager.getActiveSession(configuration) ?: return
|
||||
session.stop(executable)
|
||||
val left = executablesLeft[configuration] ?: return
|
||||
left.remove(executable)
|
||||
@@ -188,5 +178,25 @@ class ExecutionEngine(private val project: Project) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ExecutionSessionManager {
|
||||
private var activeSessions = mutableMapOf<MultiLaunchConfiguration, ExecutionSession>()
|
||||
private val rwLock = ReentrantReadWriteLock()
|
||||
|
||||
fun setActiveSession(configuration: MultiLaunchConfiguration, session: ExecutionSession?) {
|
||||
rwLock.write {
|
||||
when (session) {
|
||||
null -> activeSessions.remove(configuration)
|
||||
else -> activeSessions.put(configuration, session)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getActiveSession(configuration: MultiLaunchConfiguration): ExecutionSession? {
|
||||
return rwLock.read {
|
||||
activeSessions[configuration]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user