[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."
@Synchronized
fun addProject(target: Project) {
check(state == State.CONFIGURING) { alreadyResolvedMessage("add new project: $target") }
projectResolvers[target.path] = KotlinProjectNpmResolver(target, this)
synchronized(projectResolvers) {
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")
@@ -228,7 +229,7 @@ internal class KotlinRootNpmResolver internal constructor(
* Don't use directly, use [KotlinNpmResolutionManager.installIfNeeded] instead.
*/
internal fun prepareInstallation(logger: Logger): Installation {
synchronized(this@KotlinRootNpmResolver) {
synchronized(projectResolvers) {
check(state == State.CONFIGURING) {
"Projects must be configuring"
}
@@ -270,7 +271,7 @@ internal class KotlinRootNpmResolver internal constructor(
services: ServiceRegistry,
logger: Logger
): KotlinRootNpmResolution {
synchronized(this@KotlinRootNpmResolver) {
synchronized(projectResolvers) {
check(state == State.PROJECTS_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.BuildServiceParameters
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
import java.util.concurrent.ConcurrentHashMap
internal abstract class MayBeUpToDatePackageJsonTasksRegistry : BuildService<BuildServiceParameters.None> {
private val mayBeUpToDateTasks = mutableSetOf<String>()
private val mayBeUpToDateTasks = ConcurrentHashMap.newKeySet<String>()
fun markForNpmDependenciesResolve(task: KotlinPackageJsonTask) {
mayBeUpToDateTasks.add(task.path)