diff options
author | Stephen Judkins <stephen.judkins@gmail.com> | 2012-01-21 17:08:52 -0800 |
---|---|---|
committer | Stephen Judkins <stephen.judkins@gmail.com> | 2012-01-21 17:08:52 -0800 |
commit | dce6b34c38a6d774961ca6f9fd50b11300ecddd6 (patch) | |
tree | 449361e5c2936c67370e85ebc97844371201187d /test | |
parent | 8051740e1be3b33081b2179d1d1fd35a4c8b5c84 (diff) | |
download | scala-dce6b34c38a6d774961ca6f9fd50b11300ecddd6.tar.gz scala-dce6b34c38a6d774961ca6f9fd50b11300ecddd6.tar.bz2 scala-dce6b34c38a6d774961ca6f9fd50b11300ecddd6.zip |
Fixes SI-4929, with a test to verify.
Also fixes potential issue with Parsers.phrase not being reentrant; however, I was unable to actually reproduce this issue in practice. (The order in which lastNoSuccess was being set and compared seemed to guarantee that it would never actually be a problem).
Diffstat (limited to 'test')
-rw-r--r-- | test/files/run/t4929.check | 1 | ||||
-rw-r--r-- | test/files/run/t4929.scala | 42 |
2 files changed, 43 insertions, 0 deletions
diff --git a/test/files/run/t4929.check b/test/files/run/t4929.check new file mode 100644 index 0000000000..0f0c913d55 --- /dev/null +++ b/test/files/run/t4929.check @@ -0,0 +1 @@ +success
\ No newline at end of file diff --git a/test/files/run/t4929.scala b/test/files/run/t4929.scala new file mode 100644 index 0000000000..3208cd1b09 --- /dev/null +++ b/test/files/run/t4929.scala @@ -0,0 +1,42 @@ +import scala.util.parsing.json._ +import java.util.concurrent._ +import collection.JavaConversions._ + +object Test extends App { + + val LIMIT = 2000 + val THREAD_COUNT = 20 + val count = new java.util.concurrent.atomic.AtomicInteger(0) + + val begin = new CountDownLatch(THREAD_COUNT) + val finish = new CountDownLatch(THREAD_COUNT) + + val errors = new ConcurrentLinkedQueue[Throwable] + + (1 to THREAD_COUNT) foreach { i => + val thread = new Thread { + override def run() { + begin.await(1, TimeUnit.SECONDS) + try { + while (count.getAndIncrement() < LIMIT && errors.isEmpty) { + JSON.parseFull("""{"foo": [1,2,3,4]}""") + } + } catch { + case t: Throwable => errors.add(t) + } + + finish.await(10, TimeUnit.SECONDS) + } + } + + thread.setDaemon(true) + thread.start() + + } + + + errors foreach { throw(_) } + + println("success") + +} |