src/Pure/Concurrent/thread_attributes.ML
author wenzelm
Tue, 24 May 2016 16:24:20 +0200
changeset 63140 0644c2e5a989
parent 62924 ce47945ce4fb
child 64557 37074e22e8be
permissions -rw-r--r--
updated;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62923
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Concurrent/thread_attributes.ML
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     3
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     4
Thread attributes for interrupt handling.
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     5
*)
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     6
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     7
signature THREAD_ATTRIBUTES =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     8
sig
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
     9
  type attributes = Thread.Thread.threadAttribute list
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    10
  val no_interrupts: attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    11
  val test_interrupts: attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    12
  val public_interrupts: attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    13
  val private_interrupts: attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    14
  val sync_interrupts: attributes -> attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    15
  val safe_interrupts: attributes -> attributes
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    16
  val with_attributes: attributes -> (attributes -> 'a) -> 'a
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    17
  val uninterruptible: ((('c -> 'd) -> 'c -> 'd) -> 'a -> 'b) -> 'a -> 'b
62924
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    18
  val expose_interrupt: unit -> unit  (*exception Interrupt*)
62923
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    19
end;
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    20
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    21
structure Thread_Attributes: THREAD_ATTRIBUTES =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    22
struct
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    23
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    24
type attributes = Thread.Thread.threadAttribute list;
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    25
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    26
val no_interrupts =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    27
  [Thread.Thread.EnableBroadcastInterrupt false,
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    28
    Thread.Thread.InterruptState Thread.Thread.InterruptDefer];
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    29
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    30
val test_interrupts =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    31
  [Thread.Thread.EnableBroadcastInterrupt false,
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    32
    Thread.Thread.InterruptState Thread.Thread.InterruptSynch];
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    33
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    34
val public_interrupts =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    35
  [Thread.Thread.EnableBroadcastInterrupt true,
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    36
    Thread.Thread.InterruptState Thread.Thread.InterruptAsynchOnce];
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    37
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    38
val private_interrupts =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    39
  [Thread.Thread.EnableBroadcastInterrupt false,
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    40
    Thread.Thread.InterruptState Thread.Thread.InterruptAsynchOnce];
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    41
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    42
val sync_interrupts = map
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    43
  (fn x as Thread.Thread.InterruptState Thread.Thread.InterruptDefer => x
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    44
    | Thread.Thread.InterruptState _ => Thread.Thread.InterruptState Thread.Thread.InterruptSynch
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    45
    | x => x);
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    46
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    47
val safe_interrupts = map
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    48
  (fn Thread.Thread.InterruptState Thread.Thread.InterruptAsynch =>
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    49
      Thread.Thread.InterruptState Thread.Thread.InterruptAsynchOnce
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    50
    | x => x);
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    51
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    52
fun with_attributes new_atts e =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    53
  let
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    54
    val orig_atts = safe_interrupts (Thread.Thread.getAttributes ());
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    55
    val result = Exn.capture (fn () =>
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    56
      (Thread.Thread.setAttributes (safe_interrupts new_atts); e orig_atts)) ();
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    57
    val _ = Thread.Thread.setAttributes orig_atts;
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    58
  in Exn.release result end;
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    59
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    60
fun uninterruptible f x =
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    61
  with_attributes no_interrupts (fn atts =>
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    62
    f (fn g => fn y => with_attributes atts (fn _ => g y)) x);
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    63
62924
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    64
fun expose_interrupt () =
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    65
  let
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    66
    val orig_atts = safe_interrupts (Thread.Thread.getAttributes ());
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    67
    val _ = Thread.Thread.setAttributes test_interrupts;
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    68
    val test = Exn.capture Thread.Thread.testInterrupt ();
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    69
    val _ = Thread.Thread.setAttributes orig_atts;
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    70
  in Exn.release test end;
ce47945ce4fb tuned signature -- closer to Exn.Interrupt.expose in Scala;
wenzelm
parents: 62923
diff changeset
    71
62923
3a122e1e352a clarified bootstrap;
wenzelm
parents:
diff changeset
    72
end;