summaryrefslogtreecommitdiff
path: root/src/library/scala/collection/immutable/Stream.scala
diff options
context:
space:
mode:
authorRex Kerr <ichoran@gmail.com>2014-01-31 15:22:55 -0800
committerRex Kerr <ichoran@gmail.com>2014-01-31 15:26:59 -0800
commitf84acc99cd46e43f0ce6c466534882390459d9b5 (patch)
treebae9b9d6db5f90205aab2419ed4ffd8a47030148 /src/library/scala/collection/immutable/Stream.scala
parent624e668acfead08289078662d43d281b7b445d71 (diff)
downloadscala-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.scala8
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