diff options
author | Philipp Haller <hallerp@gmail.com> | 2011-08-01 23:54:37 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2011-08-01 23:54:37 +0000 |
commit | 74062e352955afa6869636d84035011e3518d7d4 (patch) | |
tree | 261e4314f697be50196b23ccafa0fefde768d858 /src/library | |
parent | 987c30ddfb75b965ecc8cab2dbc2ed20e1f18562 (diff) | |
download | scala-74062e352955afa6869636d84035011e3518d7d4.tar.gz scala-74062e352955afa6869636d84035011e3518d7d4.tar.bz2 scala-74062e352955afa6869636d84035011e3518d7d4.zip |
Fix memory leak in SyncVar. Review by prokopec
Diffstat (limited to 'src/library')
-rw-r--r-- | src/library/scala/concurrent/SyncVar.scala | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/library/scala/concurrent/SyncVar.scala b/src/library/scala/concurrent/SyncVar.scala index eebdd9b528..43f2ec57c0 100644 --- a/src/library/scala/concurrent/SyncVar.scala +++ b/src/library/scala/concurrent/SyncVar.scala @@ -16,11 +16,11 @@ package scala.concurrent */ class SyncVar[A] { private var isDefined: Boolean = false - private var value: A = _ + private var value: Option[A] = None - def get = synchronized { + def get: A = synchronized { while (!isDefined) wait() - value + value.get } /** Waits `timeout` millis. If `timeout <= 0` just returns 0. If the system clock @@ -50,22 +50,22 @@ class SyncVar[A] { val elapsed = waitMeasuringElapsed(rest) rest -= elapsed } - if (isDefined) Some(value) - else None + value } - def take() = synchronized { + def take(): A = synchronized { try get finally unset() } - def set(x: A) = synchronized { - value = x + // TODO: this method should be private + def set(x: A): Unit = synchronized { isDefined = true + value = Some(x) notifyAll() } - def put(x: A) = synchronized { + def put(x: A): Unit = synchronized { while (isDefined) wait() set(x) } @@ -74,8 +74,10 @@ class SyncVar[A] { isDefined } + // TODO: this method should be private def unset(): Unit = synchronized { isDefined = false + value = None notifyAll() } } |