diff options
author | Rex Kerr <ichoran@gmail.com> | 2014-01-31 15:22:55 -0800 |
---|---|---|
committer | Rex Kerr <ichoran@gmail.com> | 2014-01-31 15:26:59 -0800 |
commit | f84acc99cd46e43f0ce6c466534882390459d9b5 (patch) | |
tree | bae9b9d6db5f90205aab2419ed4ffd8a47030148 /src/library/scala/collection/immutable/Stream.scala | |
parent | 624e668acfead08289078662d43d281b7b445d71 (diff) | |
download | scala-f84acc99cd46e43f0ce6c466534882390459d9b5.tar.gz scala-f84acc99cd46e43f0ce6c466534882390459d9b5.tar.bz2 scala-f84acc99cd46e43f0ce6c466534882390459d9b5.zip |
SI-7266 Stream leaks memory
Changed tail-generation function to mutable and clear it after it's used to allow any captured memory to be freed once the tail has been generated.
(This is a case where a by-name parameter was used when a lazy val parameter was wanted instead. If we ever get lazy val parameters, we should switch to that.)
Diffstat (limited to 'src/library/scala/collection/immutable/Stream.scala')
-rw-r--r-- | src/library/scala/collection/immutable/Stream.scala | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/library/scala/collection/immutable/Stream.scala b/src/library/scala/collection/immutable/Stream.scala index 49c3b4c3cd..60de147477 100644 --- a/src/library/scala/collection/immutable/Stream.scala +++ b/src/library/scala/collection/immutable/Stream.scala @@ -1108,11 +1108,15 @@ object Stream extends SeqFactory[Stream] { override def isEmpty = false override def head = hd @volatile private[this] var tlVal: Stream[A] = _ - def tailDefined: Boolean = tlVal ne null + @volatile private[this] var tlGen = tl _ + def tailDefined: Boolean = tlGen eq null override def tail: Stream[A] = { if (!tailDefined) synchronized { - if (!tailDefined) tlVal = tl + if (!tailDefined) { + tlVal = tlGen() + tlGen = null + } } tlVal |