src/Pure/Concurrent/timeout.ML
author wenzelm
Sun, 28 Mar 2021 11:45:00 +0200
changeset 73503 eda1d95ef538
parent 73388 a40e69fde2b4
child 74870 d54b3c96ee50
permissions -rw-r--r--
misc tuning and clarification;
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
73388
a40e69fde2b4 clarified smt: support Timeout.ignored and Timeout.scale_time;
wenzelm
parents: 73387
diff changeset
    12
  val ignored: Time.time -> bool
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    13
  val scale: unit -> real
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    14
  val scale_time: Time.time -> Time.time
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    15
  val end_time: Time.time -> Time.time
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    16
  val apply: Time.time -> ('a -> 'b) -> 'a -> 'b
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    17
  val print: Time.time -> string
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    18
end;
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    19
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    20
structure Timeout: TIMEOUT =
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    21
struct
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    22
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    23
exception TIMEOUT of Time.time;
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    24
73388
a40e69fde2b4 clarified smt: support Timeout.ignored and Timeout.scale_time;
wenzelm
parents: 73387
diff changeset
    25
fun ignored timeout = timeout < Time.fromMilliseconds 1;
a40e69fde2b4 clarified smt: support Timeout.ignored and Timeout.scale_time;
wenzelm
parents: 73387
diff changeset
    26
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    27
fun scale () = Options.default_real "timeout_scale";
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    28
fun scale_time t = Time.scale (scale ()) t;
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    29
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    30
fun end_time timeout = Time.now () + scale_time timeout;
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    31
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    32
fun apply timeout f x =
73388
a40e69fde2b4 clarified smt: support Timeout.ignored and Timeout.scale_time;
wenzelm
parents: 73387
diff changeset
    33
  if ignored timeout then f x
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    34
  else
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    35
    Thread_Attributes.with_attributes Thread_Attributes.no_interrupts (fn orig_atts =>
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    36
      let
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    37
        val self = Thread.self ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    38
        val start = Time.now ();
52051
9362fcd0318c modernized TimeLimit.timeLimit using Event_Timer service -- based on more elementary version 11ae688e4e30;
wenzelm
parents: 44112
diff changeset
    39
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    40
        val request =
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    41
          Event_Timer.request {physical = false} (start + scale_time timeout)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    42
            (fn () => Isabelle_Thread.interrupt_unsynchronized self);
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    43
        val result =
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    44
          Exn.capture (fn () => Thread_Attributes.with_attributes orig_atts (fn _ => f x)) ();
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    45
73387
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    46
        val stop = Time.now ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    47
        val was_timeout = not (Event_Timer.cancel request);
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    48
        val test = Exn.capture Thread_Attributes.expose_interrupt ();
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    49
      in
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    50
        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
    51
        then raise TIMEOUT (stop - start)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    52
        else (Exn.release test; Exn.release result)
3b5196dac4c8 clarified timeouts in Isabelle/ML;
wenzelm
parents: 71692
diff changeset
    53
      end);
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    54
67000
1698e9ccef2d more portable print_time, notably for occasional negative (!) elapsed time of theory_timing;
wenzelm
parents: 62924
diff changeset
    55
fun print t = "Timeout after " ^ Value.print_time t ^ "s";
62519
a564458f94db tuned signature -- clarified modules;
wenzelm
parents: 61556
diff changeset
    56
41710
11ae688e4e30 clarified bootstrapping of structure TimeLimit;
wenzelm
parents:
diff changeset
    57
end;