Merge pull request #6003 from eatkins/simple-input-stream

Fix SimpleInputStream reads into array
This commit is contained in:
eugene yokota 2020-10-21 21:31:29 -04:00 committed by GitHub
commit 6871d66c3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 19 deletions

View File

@ -16,7 +16,7 @@ import org.jline.utils.{ ClosedException, NonBlockingReader }
import org.jline.terminal.{ Attributes, Size, Terminal => JTerminal }
import org.jline.terminal.Attributes.{ InputFlag, LocalFlag }
import org.jline.terminal.Terminal.SignalHandler
import org.jline.terminal.impl.AbstractTerminal
import org.jline.terminal.impl.{ AbstractTerminal, DumbTerminal }
import org.jline.terminal.impl.jansi.JansiSupportImpl
import org.jline.terminal.impl.jansi.win.JansiWinSysTerminal
import org.jline.utils.OSUtils
@ -73,6 +73,11 @@ private[sbt] object JLine3 {
term
}
private[sbt] def apply(term: Terminal): JTerminal = {
if (System.getProperty("jline.terminal", "") == "none")
new DumbTerminal(term.inputStream, term.outputStream)
else wrapTerminal(term)
}
private[this] def wrapTerminal(term: Terminal): JTerminal = {
new AbstractTerminal(
term.name,
"nocapabilities",

View File

@ -486,7 +486,7 @@ object Terminal {
val _ = readQueue.take
val b = in.read
buffer.put(b)
if (Thread.interrupted() || (b != -1 && !isRaw.get)) closed.set(true)
if (Thread.interrupted() || (b == -1 && isRaw.get)) closed.set(true)
else impl()
}
try impl()
@ -596,9 +596,12 @@ object Terminal {
private[sbt] trait SimpleInputStream extends InputStream {
override def read(b: Array[Byte]): Int = read(b, 0, b.length)
override def read(b: Array[Byte], off: Int, len: Int): Int = {
val byte = read()
b(off) = byte.toByte
1
read() match {
case -1 => -1
case byte =>
b(off) = byte.toByte
1
}
}
}
private[this] object proxyInputStream extends SimpleInputStream {

View File

@ -934,12 +934,9 @@ class NetworkClient(
val stopped = new AtomicBoolean(false)
override final def run(): Unit = {
def read(): Unit = {
inputStream.read match {
case -1 =>
case b =>
inLock.synchronized(stdinBytes.offer(b))
if (attached.get()) drain()
}
val b = inputStream.read
inLock.synchronized(stdinBytes.offer(b))
if (attached.get()) drain()
}
try read()
catch { case _: InterruptedException | NonFatal(_) => stopped.set(true) } finally {

View File

@ -11,7 +11,6 @@ package server
import java.io.{ IOException, InputStream, OutputStream }
import java.net.{ Socket, SocketTimeoutException }
import java.nio.channels.ClosedChannelException
import java.util.concurrent.{
ConcurrentHashMap,
Executors,
@ -85,7 +84,7 @@ final class NetworkChannel(
private var initialized = false
private val pendingRequests: mutable.Map[String, JsonRpcRequestMessage] = mutable.Map()
private[this] val inputBuffer = new LinkedBlockingQueue[Byte]()
private[this] val inputBuffer = new LinkedBlockingQueue[Int]()
private[this] val pendingWrites = new LinkedBlockingQueue[(Array[Byte], Boolean)]()
private[this] val attached = new AtomicBoolean(false)
private[this] val alive = new AtomicBoolean(true)
@ -107,7 +106,7 @@ final class NetworkChannel(
interactive.set(true)
jsonRpcNotify(promptChannel, "")
}
private[sbt] def write(byte: Byte) = inputBuffer.add(byte)
private[sbt] def write(byte: Byte) = inputBuffer.add(byte.toInt)
private[this] val terminalHolder = new AtomicReference[Terminal](Terminal.NullTerminal)
override private[sbt] def terminal: Terminal = terminalHolder.get
@ -634,15 +633,12 @@ final class NetworkChannel(
)
}
private[this] lazy val inputStream: InputStream = new InputStream {
private[this] lazy val inputStream: InputStream = new Terminal.SimpleInputStream {
override def read(): Int = {
import sjsonnew.BasicJsonProtocol._
try {
jsonRpcNotify(readSystemIn, "")
inputBuffer.take & 0xFF match {
case -1 => throw new ClosedChannelException()
case b => b
}
inputBuffer.take
} catch {
case e: IOException =>
try jsonRpcNotify(cancelReadSystemIn, "")