summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2010-10-14 05:10:25 +0000
committerPaul Phillips <paulp@improving.org>2010-10-14 05:10:25 +0000
commit492f5f52141ecd71f2decdbf7eda7aed51dfb64c (patch)
tree9863f25a0f46261145c2f01b383ecc3350bb18ed
parent77c31e39ecd2d160cc27270fc8ef31eaa56e3444 (diff)
downloadscala-492f5f52141ecd71f2decdbf7eda7aed51dfb64c.tar.gz
scala-492f5f52141ecd71f2decdbf7eda7aed51dfb64c.tar.bz2
scala-492f5f52141ecd71f2decdbf7eda7aed51dfb64c.zip
Fixing issue with XMLEventReader.stop failing t...
Fixing issue with XMLEventReader.stop failing to stop the parser thread. Contributed by Jean-Laurent Huynh, reviewed by extempore. Closes #3881.
-rw-r--r--[-rwxr-xr-x]src/library/scala/xml/pull/XMLEventReader.scala16
-rw-r--r--test/files/run/bug3881.check1
-rw-r--r--test/files/run/bug3881.scala27
3 files changed, 43 insertions, 1 deletions
diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala
index d51202f2d8..100d4fec71 100755..100644
--- a/src/library/scala/xml/pull/XMLEventReader.scala
+++ b/src/library/scala/xml/pull/XMLEventReader.scala
@@ -52,6 +52,7 @@ class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent]
// or at least as much as it can fit in the queue.)
def stop = {
produce(POISON)
+ parser.pause()
parserThread.interrupt()
}
@@ -87,8 +88,21 @@ class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent]
def entityRef(pos: Int, n: String) = setEvent(EvEntityRef(n))
def text(pos: Int, txt:String) = setEvent(EvText(txt))
+ // use to make thread sleep on XMLEventReader.stop
+ @volatile private var pauseRequested = false
+ // requesting this thread to sleep so that it can be interrupted.
+ def pause() { pauseRequested = true }
+
override def run() {
- curInput = input
+ curInput = new Source {
+ val iter = new Iterator[Char] {
+ def hasNext = input.hasNext
+ def next() = {
+ if (pauseRequested) Thread.sleep(1000)
+ input.next()
+ }
+ }
+ }
interruptibly { this.initialize.document() }
setEvent(POISON)
}
diff --git a/test/files/run/bug3881.check b/test/files/run/bug3881.check
new file mode 100644
index 0000000000..888acde74f
--- /dev/null
+++ b/test/files/run/bug3881.check
@@ -0,0 +1 @@
+1000000 xml events
diff --git a/test/files/run/bug3881.scala b/test/files/run/bug3881.scala
new file mode 100644
index 0000000000..21247492f5
--- /dev/null
+++ b/test/files/run/bug3881.scala
@@ -0,0 +1,27 @@
+object Test {
+
+ def forever() = new io.Source {
+ val iter = "<foo>".iterator ++ new Iterator[Char] {
+ var count = -1
+ val bar = "<bar/>\n"
+ def hasNext = true
+ def next() = {
+ count += 1
+ bar(count % bar.length)
+ }
+ }
+ }
+
+ def main(args: Array[String]): Unit = {
+ val src = forever()
+ val reader = new xml.pull.XMLEventReader(src)
+ var count = 0
+ while (reader.hasNext && count < 1000000) {
+ reader.next
+ count += 1
+ }
+ reader.stop
+ println(count + " xml events")
+ }
+}
+