uniform raw_dump for input/output fifos on Cygwin;
authorwenzelm
Mon, 09 Aug 2010 21:35:45 +0200
changeset 38255 bf44a85c74cc
parent 38254 fb1b255d6e36
child 38256 d2f094d97c91
uniform raw_dump for input/output fifos on Cygwin;
lib/scripts/raw_dump
src/Pure/System/isabelle_system.scala
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/scripts/raw_dump	Mon Aug 09 21:35:45 2010 +0200
@@ -0,0 +1,56 @@
+#!/usr/bin/env perl
+#
+# Author: Makarius
+#
+# raw_dump - direct copy without extra buffering
+#
+
+use warnings;
+use strict;
+
+use IO::File;
+
+
+# args
+
+my ($input, $output) = @ARGV;
+
+
+# prepare files
+
+my $infile;
+my $outfile;
+
+if ($input eq "-") { $infile = *STDIN; }
+else {
+  $infile = new IO::File $input, "r";
+  defined $infile || die $!;
+}
+
+if ($output eq "-") { $outfile = *STDOUT; }
+else {
+  $outfile = new IO::File $output, "w";
+  defined $outfile || die $!;
+}
+
+binmode $infile;
+binmode $outfile;
+
+
+# main loop
+
+my $chunk;
+while ((sysread $infile, $chunk, 65536), length $chunk > 0) {
+  my $end = length $chunk;
+  my $offset = 0;
+  while ($offset < $end) {
+    $offset += syswrite $outfile, $chunk, $end - $offset, $offset;
+  }
+}
+
+
+# cleanup
+
+undef $infile;
+undef $outfile;
+
--- a/src/Pure/System/isabelle_system.scala	Mon Aug 09 21:23:24 2010 +0200
+++ b/src/Pure/System/isabelle_system.scala	Mon Aug 09 21:35:45 2010 +0200
@@ -291,9 +291,8 @@
   {
     // block until peer is ready
     val stream =
-      if (Platform.is_windows) {
-        // Cygwin fifo as Windows/Java input stream
-        val proc = execute(false, "cat", fifo)
+      if (Platform.is_windows) { // Cygwin fifo as Windows/Java input stream
+        val proc = execute(false, expand_path("$ISABELLE_HOME/lib/scripts/raw_dump"), fifo, "-")
         proc.getOutputStream.close
         proc.getErrorStream.close
         proc.getInputStream
@@ -306,14 +305,8 @@
   {
     // block until peer is ready
     val stream =
-      if (Platform.is_windows) {
-        // Cygwin fifo as Windows/Java output stream (beware of buffering)
-        // FIXME FIXME FIXME
-        val script =
-          "open(FIFO, \">" + fifo + "\") || die $!; my $buffer; " +
-          "while ((sysread STDIN, $buffer, 65536), length $buffer > 0)" +
-          " { syswrite FIFO, $buffer; }; close FIFO;"
-        val proc = execute(false, "perl", "-e", script)
+      if (Platform.is_windows) { // Cygwin fifo as Windows/Java output stream
+        val proc = execute(false, expand_path("$ISABELLE_HOME/lib/scripts/raw_dump"), "-", fifo)
         proc.getInputStream.close
         proc.getErrorStream.close
         val out = proc.getOutputStream
@@ -324,7 +317,6 @@
           override def write(b: Array[Byte], off: Int, len: Int) { out.write(b, off, len) }
           override def write(b: Int) { out.write(b) }
         }
-        proc.getOutputStream
       }
       else new FileOutputStream(fifo)
     new BufferedOutputStream(stream)