You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2010/12/28 23:32:39 UTC

svn commit: r1053473 - in /incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.shell/src/main/scala/org/apache/clerezza/shell: ConsoleShell.scala InterruptibleInputStream.scala Shell.scala

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")
 		}
 	}