src/Pure/ML-Systems/polyml-time-limit.ML
author wenzelm
Mon, 29 Aug 2005 16:18:04 +0200
changeset 17184 3d80209e9a53
parent 16993 2ec0b8159e8e
permissions -rw-r--r--
use AList operations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14849
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     1
(*  Title:      Pure/ML-Systems/polyml-time-limit.ML
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     2
    ID:         $Id$
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     3
    Author:     Tjark Weber
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     4
    Copyright   2004
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     5
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     6
Bounded time execution (similar to SML/NJ's TimeLimit structure) for Poly/ML.
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     7
*)
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
     8
16993
wenzelm
parents: 14849
diff changeset
     9
structure TimeLimit:
wenzelm
parents: 14849
diff changeset
    10
sig
wenzelm
parents: 14849
diff changeset
    11
  exception TimeOut
wenzelm
parents: 14849
diff changeset
    12
  val timeLimit : Time.time -> ('a -> 'b) -> 'a -> 'b
wenzelm
parents: 14849
diff changeset
    13
end =
wenzelm
parents: 14849
diff changeset
    14
struct
wenzelm
parents: 14849
diff changeset
    15
  exception TimeOut
14849
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
    16
16993
wenzelm
parents: 14849
diff changeset
    17
  fun timeLimit t f x =
wenzelm
parents: 14849
diff changeset
    18
    let
wenzelm
parents: 14849
diff changeset
    19
      datatype ('a, 'b) union = INL of 'a | INR of 'b
wenzelm
parents: 14849
diff changeset
    20
      val result = Process.channel ()
wenzelm
parents: 14849
diff changeset
    21
      fun workerThread () =
wenzelm
parents: 14849
diff changeset
    22
        Process.send (result, SOME (INL (f x) handle exn => INR exn))
wenzelm
parents: 14849
diff changeset
    23
      val interrupt = Process.console workerThread
wenzelm
parents: 14849
diff changeset
    24
      val old_handle = Signal.signal (Posix.Signal.alrm,
wenzelm
parents: 14849
diff changeset
    25
        Signal.SIG_HANDLE (fn _ => (Process.send (result, NONE)) before (interrupt ())))
wenzelm
parents: 14849
diff changeset
    26
    in
wenzelm
parents: 14849
diff changeset
    27
      Posix.Process.alarm t;
wenzelm
parents: 14849
diff changeset
    28
      case Process.receive result of
wenzelm
parents: 14849
diff changeset
    29
        SOME (INL fx) =>
wenzelm
parents: 14849
diff changeset
    30
          (Posix.Process.alarm Time.zeroTime; Signal.signal (Posix.Signal.alrm, old_handle); fx)
wenzelm
parents: 14849
diff changeset
    31
      | SOME (INR exn) =>
wenzelm
parents: 14849
diff changeset
    32
          (Posix.Process.alarm Time.zeroTime; Signal.signal (Posix.Signal.alrm, old_handle);
wenzelm
parents: 14849
diff changeset
    33
           raise exn)
wenzelm
parents: 14849
diff changeset
    34
      | NONE => (Signal.signal (Posix.Signal.alrm, old_handle); raise TimeOut)
wenzelm
parents: 14849
diff changeset
    35
    end
14849
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
    36
73a0a6e0426a SML/NJs TimeLimit structure ported to Poly/ML
webertj
parents:
diff changeset
    37
end;