src/Pure/Concurrent/simple_thread.ML
author wenzelm
Wed, 11 Nov 2009 00:09:15 +0100
changeset 33605 f91ec14e20b6
parent 33602 d25e6bd6ca95
child 37216 3165bc303f66
permissions -rw-r--r--
admit dummy implementation;
wenzelm@28241
     1
(*  Title:      Pure/Concurrent/simple_thread.ML
wenzelm@28241
     2
    Author:     Makarius
wenzelm@28241
     3
wenzelm@28577
     4
Simplified thread operations.
wenzelm@28241
     5
*)
wenzelm@28241
     6
wenzelm@28241
     7
signature SIMPLE_THREAD =
wenzelm@28241
     8
sig
wenzelm@33602
     9
  val attributes: bool -> Thread.threadAttribute list
wenzelm@28241
    10
  val fork: bool -> (unit -> unit) -> Thread.thread
wenzelm@28550
    11
  val interrupt: Thread.thread -> unit
wenzelm@28577
    12
  val synchronized: string -> Mutex.mutex -> (unit -> 'a) -> 'a
wenzelm@28241
    13
end;
wenzelm@28241
    14
wenzelm@28241
    15
structure SimpleThread: SIMPLE_THREAD =
wenzelm@28241
    16
struct
wenzelm@28241
    17
wenzelm@33602
    18
fun attributes interrupts =
wenzelm@33602
    19
  if interrupts then Multithreading.public_interrupts else Multithreading.no_interrupts;
wenzelm@33602
    20
wenzelm@28241
    21
fun fork interrupts body =
wenzelm@33220
    22
  Thread.fork (fn () => exception_trace (fn () => body () handle Exn.Interrupt => ()),
wenzelm@33602
    23
    attributes interrupts);
wenzelm@28241
    24
wenzelm@28550
    25
fun interrupt thread = Thread.interrupt thread handle Thread _ => ();
wenzelm@28550
    26
wenzelm@28577
    27
wenzelm@28577
    28
(* basic synchronization *)
wenzelm@28577
    29
wenzelm@33605
    30
fun synchronized name lock e =
wenzelm@33605
    31
  if Multithreading.available then
wenzelm@33605
    32
    Exn.release (uninterruptible (fn restore_attributes => fn () =>
wenzelm@33605
    33
    let
wenzelm@33605
    34
      val immediate =
wenzelm@33605
    35
        if Mutex.trylock lock then true
wenzelm@33605
    36
        else
wenzelm@33605
    37
          let
wenzelm@33605
    38
            val _ = Multithreading.tracing 5 (fn () => name ^ ": locking ...");
wenzelm@33605
    39
            val time = Multithreading.real_time Mutex.lock lock;
wenzelm@33605
    40
            val _ = Multithreading.tracing_time true time
wenzelm@33605
    41
              (fn () => name ^ ": locked after " ^ Time.toString time);
wenzelm@33605
    42
          in false end;
wenzelm@33605
    43
      val result = Exn.capture (restore_attributes e) ();
wenzelm@33605
    44
      val _ =
wenzelm@33605
    45
        if immediate then () else Multithreading.tracing 5 (fn () => name ^ ": unlocking ...");
wenzelm@33605
    46
      val _ = Mutex.unlock lock;
wenzelm@33605
    47
    in result end) ())
wenzelm@33605
    48
  else e ();
wenzelm@28577
    49
wenzelm@28241
    50
end;