X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms.jshell%2Fsrc%2Forg%2Fargeo%2Fcms%2Fjshell%2FSocketPipeMirror.java;h=1e6c9deabac78a289b5dc8ec8f57047970609b6c;hb=7a1298bb4b78713553a37fba483373eeaf738069;hp=f763d54b6067cb4cfbf4015fc208911fa56cc461;hpb=2c5da70747629282585d5515720dcb1515a0011c;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms.jshell/src/org/argeo/cms/jshell/SocketPipeMirror.java b/org.argeo.cms.jshell/src/org/argeo/cms/jshell/SocketPipeMirror.java index f763d54b6..1e6c9deab 100644 --- a/org.argeo.cms.jshell/src/org/argeo/cms/jshell/SocketPipeMirror.java +++ b/org.argeo.cms.jshell/src/org/argeo/cms/jshell/SocketPipeMirror.java @@ -20,7 +20,10 @@ class SocketPipeMirror implements Closeable { private Thread readInThread; private Thread writeOutThread; - public SocketPipeMirror() throws IOException { + private final String id; + + public SocketPipeMirror(String id) throws IOException { + this.id = id; inPipe = Pipe.open(); outPipe = Pipe.open(); in = Channels.newInputStream(inPipe.source()); @@ -33,19 +36,20 @@ class SocketPipeMirror implements Closeable { try { ByteBuffer buffer = ByteBuffer.allocate(1024); while (!readInThread.isInterrupted() && channel.isConnected()) { - if (channel.read(buffer) < 0) + if (channel.read(buffer) < 0) { + in.close(); break; + } buffer.flip(); inPipe.sink().write(buffer); buffer.rewind(); } } catch (AsynchronousCloseException e) { // ignore - // TODO make it cleaner } catch (IOException e) { e.printStackTrace(); } - }, "Read in"); + }, "JShell read " + id); readInThread.start(); writeOutThread = new Thread(() -> { @@ -53,8 +57,10 @@ class SocketPipeMirror implements Closeable { try { ByteBuffer buffer = ByteBuffer.allocate(1024); while (!writeOutThread.isInterrupted() && channel.isConnected()) { - if (outPipe.source().read(buffer) < 0) + if (outPipe.source().read(buffer) < 0) { + out.close(); break; + } buffer.flip(); channel.write(buffer); buffer.rewind(); @@ -62,7 +68,7 @@ class SocketPipeMirror implements Closeable { } catch (IOException e) { e.printStackTrace(); } - }, "Write out"); + }, "JShell write " + id); writeOutThread.start(); } @@ -70,10 +76,20 @@ class SocketPipeMirror implements Closeable { @Override public void close() throws IOException { // TODO make it more robust - readInThread.interrupt(); - writeOutThread.interrupt(); +// readInThread.interrupt(); +// writeOutThread.interrupt(); in.close(); out.close(); + try { + readInThread.join(); + } catch (InterruptedException e) { + // silent + } + try { + writeOutThread.join(); + } catch (InterruptedException e) { + // silent + } } public InputStream getInputStream() {