summaryrefslogtreecommitdiff
path: root/test/files/run/t7775.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-08-23 09:29:56 +0200
committerJason Zaugg <jzaugg@gmail.com>2013-08-26 16:11:10 +0200
commit9d5ed33ef9b503f20506dbe3e410960069a99d0a (patch)
treed9a59a5b289a9fafda3bccc0a3486c060a72009b /test/files/run/t7775.scala
parent7b351dca8458f599f5fafef4daa307351031ef06 (diff)
downloadscala-9d5ed33ef9b503f20506dbe3e410960069a99d0a.tar.gz
scala-9d5ed33ef9b503f20506dbe3e410960069a99d0a.tar.bz2
scala-9d5ed33ef9b503f20506dbe3e410960069a99d0a.zip
SI-7775 Harden against the shifting sands of System.getProperties
If another thread writes a new system property (which can happen in pretty innocuous code such as `new Date`!), the compiler startup could fail with a `ConcurrentModificationException` as it iterated all bindings in the properties map in search of a boot classpath property for esoteric JVMs. This commit uses `Properties#getStringProperties` to get a snapshot of the keys that isn't backed by the live map, and iterates these instead. That method will also limit us to bindings with String values, which is all that we expect.
Diffstat (limited to 'test/files/run/t7775.scala')
-rw-r--r--test/files/run/t7775.scala17
1 files changed, 17 insertions, 0 deletions
diff --git a/test/files/run/t7775.scala b/test/files/run/t7775.scala
new file mode 100644
index 0000000000..5fb0327611
--- /dev/null
+++ b/test/files/run/t7775.scala
@@ -0,0 +1,17 @@
+import scala.concurrent.{duration, future, Await, ExecutionContext}
+import scala.tools.nsc.Settings
+import ExecutionContext.Implicits.global
+
+// Was failing pretty regularly with a ConcurrentModificationException as
+// WrappedProperties#systemProperties iterated directly over the mutable
+// global system properties map.
+object Test {
+ def main(args: Array[String]) {
+ val tries = 1000 // YMMV
+ val compiler = future {
+ for(_ <- 1 to tries) new Settings(_ => {})
+ }
+ for(i <- 1 to tries * 10) System.setProperty(s"foo$i", i.toString)
+ Await.result(compiler, duration.Duration.Inf)
+ }
+}