Author: reto
Date: Tue Dec 28 22:32:39 2010
New Revision: 1053473

URL: http://svn.apache.org/viewvc?rev=1053473&view=rev
Log:
CLEREZZA-353: no longer waiting for the next character of system.in when the 
shell is terminated

Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/ConsoleShell.scala
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/InterruptibleInputStream.scala
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/Shell.scala

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/ConsoleShell.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/ConsoleShell.scala?rev=1053473&r1=1053472&r2=1053473&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/ConsoleShell.scala
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/ConsoleShell.scala
 Tue Dec 28 22:32:39 2010
@@ -22,7 +22,10 @@ package org.apache.clerezza.shell;
 
 import org.osgi.framework.BundleContext
 import org.osgi.service.component.ComponentContext;
+import java.nio.channels.Channels
 import org.osgi.framework.Bundle
+import java.io.FileDescriptor
+import java.io.FileInputStream
 import java.net._
 import scala.tools.nsc._;
 import scala.tools.nsc.interpreter._;
@@ -49,7 +52,9 @@ class ConsoleShell()  {
                        bundle.stop()
                        stoppedBundle = Some(bundle)
                }
-               interruptibleIn = new InterruptibleInputStream(System.in)
+               val in =  Channels.newInputStream(
+            (new FileInputStream(FileDescriptor.in)).getChannel());
+               interruptibleIn = new InterruptibleInputStream(in)
                val shell = factory.createShell(interruptibleIn, System.out)
                shell.start()
                shellOption = Some(shell)

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/InterruptibleInputStream.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/InterruptibleInputStream.scala?rev=1053473&r1=1053472&r2=1053473&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/InterruptibleInputStream.scala
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/InterruptibleInputStream.scala
 Tue Dec 28 22:32:39 2010
@@ -19,6 +19,7 @@
 package org.apache.clerezza.shell
 
 import java.io.InputStream
+import java.nio.channels.ClosedByInterruptException
 import scala.actors.Actor
 import scala.actors.Actor._
 
@@ -26,7 +27,7 @@ class InterruptibleInputStream(base: Inp
        private case object Stop
        private case object Read
 
-       private var lastReader: Actor = null
+       private var readingThread: Thread = null
 
        val readerActor = new Actor() {
                def act() {
@@ -34,8 +35,16 @@ class InterruptibleInputStream(base: Inp
                                react {
                                        case Stop => exit()
                                        case Read => {
-                                                       val ch = base.read()
-                                                       lastReader ! ch
+                                                       readingThread = 
Thread.currentThread
+                                                       val ch = try {
+                                                                base.read()
+                                                       } catch {
+                                                               case e: 
ClosedByInterruptException => {
+                                                                               
-1
+                                                               }
+                                                       }
+                                                       readingThread = null
+                                                       sender ! ch
                                        }
                                }
                        }
@@ -44,7 +53,6 @@ class InterruptibleInputStream(base: Inp
        readerActor.start()
 
        def read() = {
-               lastReader = self
                readerActor ! Read
                self.receive {
                        case x: Int => x
@@ -53,8 +61,9 @@ class InterruptibleInputStream(base: Inp
 
        def terminate() {
                readerActor ! Stop
-               if (lastReader != null) {
-                       lastReader ! -1
+               val currentReadingThread = readingThread
+               if (currentReadingThread != null) {
+                       currentReadingThread.interrupt()
                }
        }
 

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/Shell.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/Shell.scala?rev=1053473&r1=1053472&r2=1053473&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/Shell.scala
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell/Shell.scala
 Tue Dec 28 22:32:39 2010
@@ -46,8 +46,6 @@ import scala.tools.nsc.io.{AbstractFile,
 import scala.tools.nsc.util._
 import scala.tools.nsc.symtab.SymbolLoaders
 import scala.tools.nsc.reporters.ConsoleReporter
-import scala.tools.nsc.reporters.ConsoleReporter
-import scala.tools.nsc.reporters.ConsoleReporter
 import scala.tools.nsc.reporters.Reporter
 import scala.tools.util.PathResolver
 import scala.tools.nsc.util.{ClassPath, JavaClassPath}
@@ -178,15 +176,16 @@ class Shell(factory: InterpreterFactory,
                        plushln(welcomeMsg)
                }
        }
-       val console: Actor = actor {
-               println("starting console")
-               try {
-                       interpreterLoop.main(Array[String]())
-               } finally {
-                       for (l <- terminationListeners) {
-                               l.terminated
+       val console: Actor = new DaemonActor {
+               def act() {
+                       try {
+                               interpreterLoop.main(Array[String]())
+                       } finally {
+                               for (l <- terminationListeners) {
+                                       l.terminated
+                               }
+                               println("console terminated")
                        }
-                       println("console terminated")
                }
        }
 


Reply via email to