src/Pure/System/system_channel.ML
author wenzelm
Thu, 05 Sep 2013 21:37:32 +0200
changeset 53423 b5a279c7d7f3
parent 50800 c0fb2839d1a9
child 54341 e1c275df5522
permissions -rw-r--r--
more explicit cygwin_root (again) -- do not rely on isabelle_home as cwd;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/System/system_channel.ML
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     3
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     4
Portable system channel for inter-process communication, based on
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     5
named pipes or sockets.
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     6
*)
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     7
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     8
signature SYSTEM_CHANNEL =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
     9
sig
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    10
  type T
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    11
  val input_line: T -> string option
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    12
  val inputN: T -> int -> string
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    13
  val output: T -> string -> unit
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    14
  val flush: T -> unit
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    15
  val fifo_rendezvous: string -> string -> T
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    16
  val socket_rendezvous: string -> T
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    17
end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    18
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    19
structure System_Channel: SYSTEM_CHANNEL =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    20
struct
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    21
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    22
datatype T = System_Channel of
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    23
 {input_line: unit -> string option,
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    24
  inputN: int -> string,
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    25
  output: string -> unit,
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    26
  flush: unit -> unit};
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    27
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    28
fun input_line (System_Channel {input_line = f, ...}) = f ();
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    29
fun inputN (System_Channel {inputN = f, ...}) n = f n;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    30
fun output (System_Channel {output = f, ...}) s = f s;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    31
fun flush (System_Channel {flush = f, ...}) = f ();
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    32
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    33
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    34
(* named pipes *)
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    35
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    36
fun fifo_rendezvous fifo1 fifo2 =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    37
  let
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    38
    val in_stream = TextIO.openIn fifo1;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    39
    val out_stream = TextIO.openOut fifo2;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    40
    val _ = TextIO.StreamIO.setBufferMode (TextIO.getOutstream out_stream, IO.BLOCK_BUF);
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    41
  in
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    42
    System_Channel
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    43
     {input_line = fn () => TextIO.inputLine in_stream,
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    44
      inputN = fn n => TextIO.inputN (in_stream, n),
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    45
      output = fn s => TextIO.output (out_stream, s),
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    46
      flush = fn () => TextIO.flushOut out_stream}
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    47
  end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    48
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    49
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    50
(* sockets *)
45058
8b20be429cf3 raw unbuffered socket IO, which bypasses the fragile BinIO layer in Poly/ML 5.4.x;
wenzelm
parents: 45029
diff changeset
    51
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    52
fun read_line in_stream =
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    53
  let
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    54
    fun result cs = String.implode (rev (#"\n" :: cs));
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    55
    fun read cs =
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    56
      (case BinIO.input1 in_stream of
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    57
        NONE => if null cs then NONE else SOME (result cs)
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    58
      | SOME b =>
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    59
          (case Byte.byteToChar b of
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    60
            #"\n" => SOME (result cs)
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    61
          | c => read (c :: cs)));
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    62
  in read [] end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    63
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    64
fun socket_rendezvous name =
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    65
  let
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    66
    val (in_stream, out_stream) = Socket_IO.open_streams name;
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    67
    val _ = BinIO.StreamIO.setBufferMode (BinIO.getOutstream out_stream, IO.BLOCK_BUF);
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    68
  in
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    69
    System_Channel
50800
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    70
     {input_line = fn () => read_line in_stream,
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    71
      inputN = fn n => Byte.bytesToString (BinIO.inputN (in_stream, n)),
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    72
      output = fn s => BinIO.output (out_stream, Byte.stringToBytes s),
c0fb2839d1a9 recovered buffered sockets from 11f622794ad6 -- requires Poly/ML 5.5.x;
wenzelm
parents: 45158
diff changeset
    73
      flush = fn () => BinIO.flushOut out_stream}
45029
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    74
  end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    75
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    76
end;
63144ea111f7 abstract System_Channel in ML (cf. Scala version);
wenzelm
parents:
diff changeset
    77