summaryrefslogtreecommitdiff
path: root/test/files/jvm/sync-var.scala
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2009-05-15 15:44:54 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2009-05-15 15:44:54 +0000
commit10830eaae2955766378369b8d1bcc0e6963b9b7f (patch)
tree595d0d162d94eda17062d4d13710378930b7ac7f /test/files/jvm/sync-var.scala
parentfbf991833d5ec0d9890ac1e7df9f53209e313552 (diff)
downloadscala-10830eaae2955766378369b8d1bcc0e6963b9b7f.tar.gz
scala-10830eaae2955766378369b8d1bcc0e6963b9b7f.tar.bz2
scala-10830eaae2955766378369b8d1bcc0e6963b9b7f.zip
1.4-related cleanup and reorganization.
Removed a bunch of now useless 1.4 code, merged back jvm5-specific partest tests into the general jvm tests, documentation updates.
Diffstat (limited to 'test/files/jvm/sync-var.scala')
-rw-r--r--test/files/jvm/sync-var.scala53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/files/jvm/sync-var.scala b/test/files/jvm/sync-var.scala
new file mode 100644
index 0000000000..aa6ae9fa34
--- /dev/null
+++ b/test/files/jvm/sync-var.scala
@@ -0,0 +1,53 @@
+import java.util.concurrent._
+import java.util.concurrent.atomic._
+
+object Test { def main(args: Array[String]) {
+
+val n = 10000
+val i = new AtomicInteger(n)
+val j = new AtomicInteger(n)
+val sum = new AtomicInteger
+
+val q = new scala.concurrent.SyncVar[Int]
+
+val producers = (1 to 3).force map { z => new Thread {
+ override def run() {
+ var again = true
+ while (again) {
+ val x = i.getAndDecrement()
+ if (x > 0)
+ q put x
+ else
+ again = false
+ }
+ }
+} }
+
+val summers = (1 to 7).force map { z => new Thread {
+ override def run() {
+ val x = j.decrementAndGet()
+ if (x >= 0) {
+ sum addAndGet q.take()
+ }
+ if (x > 0) {
+ run()
+ } else {
+ // done
+ }
+ }
+} }
+
+summers foreach { _.start() }
+producers foreach { _.start() }
+
+summers foreach { _.join() }
+
+val got = sum.get
+val expected = (n + 1) * n / 2
+println(got + " " + expected + " " + (got == expected))
+
+producers foreach { _.join() }
+
+} }
+
+// vim: set ts=2 sw=2 et: