[Gradle] KotlinToolRunner: Capture System.getProperties() as List
This is done to avoid a potential `ConcurrentModificationException`: ``` Caused by: java.util.ConcurrentModificationException at java.util.Hashtable$Enumerator.next(Hashtable.java:1387) at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:349) at org.gradle.internal.classpath.Instrumented$DecoratingEntrySet$1.computeNext(Instrumented.java:343) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136) at kotlin.sequences.TransformingSequence$iterator$1.hasNext(Sequences.kt:176) at kotlin.sequences.FilteringSequence$iterator$1.calcNext(Sequences.kt:131) at kotlin.sequences.FilteringSequence$iterator$1.hasNext(Sequences.kt:156) at kotlin.collections.MapsKt__MapsKt.putAll(Maps.kt:419) at kotlin.collections.MapsKt__MapsKt.toMap(Maps.kt:587) at kotlin.collections.MapsKt__MapsKt.toMap(Maps.kt:581) at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.runViaExec(KotlinToolRunner.kt:95) at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.run(KotlinToolRunner.kt:85) ```
This commit is contained in:
committed by
Space
parent
642b403232
commit
66d344975b
+10
-1
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.konan.target.HostManager
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.lang.reflect.InvocationTargetException
|
import java.lang.reflect.InvocationTargetException
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
import java.util.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
// Note: this class is public because it is used in the K/N build infrastructure.
|
// Note: this class is public because it is used in the K/N build infrastructure.
|
||||||
@@ -88,7 +89,10 @@ abstract class KotlinToolRunner(
|
|||||||
private fun runViaExec(args: List<String>) {
|
private fun runViaExec(args: List<String>) {
|
||||||
val transformedArgs = transformArgs(args)
|
val transformedArgs = transformArgs(args)
|
||||||
val classpath = project.files(classpath)
|
val classpath = project.files(classpath)
|
||||||
val systemProperties = System.getProperties().asSequence()
|
val systemProperties = System.getProperties()
|
||||||
|
/* Capture 'System.getProperties()' as List to avoid potential 'ConcurrentModificationException' */
|
||||||
|
.toListSynchronized()
|
||||||
|
.asSequence()
|
||||||
.map { (k, v) -> k.toString() to v.toString() }
|
.map { (k, v) -> k.toString() to v.toString() }
|
||||||
.filter { (k, _) -> k !in execSystemPropertiesBlacklist }
|
.filter { (k, _) -> k !in execSystemPropertiesBlacklist }
|
||||||
.escapeQuotesForWindows()
|
.escapeQuotesForWindows()
|
||||||
@@ -173,5 +177,10 @@ abstract class KotlinToolRunner(
|
|||||||
any { it == '"' || it.isWhitespace() } -> '"' + escapeStringCharacters(this) + '"'
|
any { it == '"' || it.isWhitespace() } -> '"' + escapeStringCharacters(this) + '"'
|
||||||
else -> this
|
else -> this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safely enter the [Properties] monitor and capture the current values
|
||||||
|
*/
|
||||||
|
private fun Properties.toListSynchronized(): List<Pair<Any, Any>> = synchronized(this) { toList() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user