src/Pure/Concurrent/timeout.ML
author wenzelm
Fri, 05 Mar 2021 17:29:49 +0100
changeset 73387 3b5196dac4c8
parent 71692 f8e52c0152fe
child 73388 a40e69fde2b4
permissions -rw-r--r--
clarified timeouts in Isabelle/ML;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
     1
(*  Title:      Pure/Concurrent/timeout.ML
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
     3
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
     4
Execution with relative timeout:
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
     5
  - timeout specification < 1ms means no timeout
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
     6
  - actual timeout is subject to system option "timeout_scale"
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
     7
*)
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
     8
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
     9
signature TIMEOUT =
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    10
sig
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    11
  exception TIMEOUT of Time.time
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    12
  val scale: unit -> real
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    13
  val scale_time: Time.time -> Time.time
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    14
  val end_time: Time.time -> Time.time
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    15
  val apply: Time.time -> ('a -> 'b) -> 'a -> 'b
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    16
  val print: Time.time -> string
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    17
end;
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    18
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    19
structure Timeout: TIMEOUT =
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    20
struct
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    21
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    22
exception TIMEOUT of Time.time;
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    23
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    24
fun scale () = Options.default_real "timeout_scale";
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    25
fun scale_time t = Time.scale (scale ()) t;
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    26
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    27
fun end_time timeout = Time.now () + scale_time timeout;
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    28
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    29
fun apply timeout f x =
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    30
  if timeout < Time.fromMilliseconds 1 then f x
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    31
  else
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    32
    Thread_Attributes.with_attributes Thread_Attributes.no_interrupts (fn orig_atts =>
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    33
      let
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    34
        val self = Thread.self ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    35
        val start = Time.now ();
52051
9362fcd0318c modernized TimeLimit.timeLimit using Event_Timer service -- based on more elementary version 11ae688e4e30;
wenzelm
parents: 44112
diff changeset
    36
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    37
        val request =
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    38
          Event_Timer.request {physical = false} (start + scale_time timeout)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    39
            (fn () => Isabelle_Thread.interrupt_unsynchronized self);
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    40
        val result =
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    41
          Exn.capture (fn () => Thread_Attributes.with_attributes orig_atts (fn _ => f x)) ();
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    42
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    43
        val stop = Time.now ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    44
        val was_timeout = not (Event_Timer.cancel request);
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    45
        val test = Exn.capture Thread_Attributes.expose_interrupt ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    46
      in
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    47
        if was_timeout andalso (Exn.is_interrupt_exn result orelse Exn.is_interrupt_exn test)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    48
        then raise TIMEOUT (stop - start)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    49
        else (Exn.release test; Exn.release result)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    50
      end);
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    51
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 62924
diff changeset
    52
fun print t = "Timeout after " ^ Value.print_time t ^ "s";
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    53
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    54
end;