[Gradle, JS] Fix NPM resolution synchronization issues

#KT-49201 Fixed
This commit is contained in:
Alexander Likhachev
2021-10-12 15:18:58 +03:00
committed by Space
parent f4067f05a2
commit 754595e496
2 changed files with 8 additions and 6 deletions
@@ -185,10 +185,11 @@ internal class KotlinRootNpmResolver internal constructor(
fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved."
@Synchronized
fun addProject(target: Project) { fun addProject(target: Project) {
check(state == State.CONFIGURING) { alreadyResolvedMessage("add new project: $target") } synchronized(projectResolvers) {
projectResolvers[target.path] = KotlinProjectNpmResolver(target, this) check(state == State.CONFIGURING) { alreadyResolvedMessage("add new project: $target") }
projectResolvers[target.path] = KotlinProjectNpmResolver(target, this)
}
} }
operator fun get(projectPath: String) = projectResolvers[projectPath] ?: error("$projectPath is not configured for JS usage") operator fun get(projectPath: String) = projectResolvers[projectPath] ?: error("$projectPath is not configured for JS usage")
@@ -228,7 +229,7 @@ internal class KotlinRootNpmResolver internal constructor(
* Don't use directly, use [KotlinNpmResolutionManager.installIfNeeded] instead. * Don't use directly, use [KotlinNpmResolutionManager.installIfNeeded] instead.
*/ */
internal fun prepareInstallation(logger: Logger): Installation { internal fun prepareInstallation(logger: Logger): Installation {
synchronized(this@KotlinRootNpmResolver) { synchronized(projectResolvers) {
check(state == State.CONFIGURING) { check(state == State.CONFIGURING) {
"Projects must be configuring" "Projects must be configuring"
} }
@@ -270,7 +271,7 @@ internal class KotlinRootNpmResolver internal constructor(
services: ServiceRegistry, services: ServiceRegistry,
logger: Logger logger: Logger
): KotlinRootNpmResolution { ): KotlinRootNpmResolution {
synchronized(this@KotlinRootNpmResolver) { synchronized(projectResolvers) {
check(state == State.PROJECTS_CLOSED) { check(state == State.PROJECTS_CLOSED) {
"Projects must be closed" "Projects must be closed"
} }
@@ -10,9 +10,10 @@ import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters import org.gradle.api.services.BuildServiceParameters
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
import java.util.concurrent.ConcurrentHashMap
internal abstract class MayBeUpToDatePackageJsonTasksRegistry : BuildService<BuildServiceParameters.None> { internal abstract class MayBeUpToDatePackageJsonTasksRegistry : BuildService<BuildServiceParameters.None> {
private val mayBeUpToDateTasks = mutableSetOf<String>() private val mayBeUpToDateTasks = ConcurrentHashMap.newKeySet<String>()
fun markForNpmDependenciesResolve(task: KotlinPackageJsonTask) { fun markForNpmDependenciesResolve(task: KotlinPackageJsonTask) {
mayBeUpToDateTasks.add(task.path) mayBeUpToDateTasks.add(task.path)