src/Pure/ML-Systems/multithreading.ML
author wenzelm
Fri, 15 Feb 2008 23:22:02 +0100
changeset 26074 44c5419cd9f1
parent 25775 90525e67ede7
child 26082 ea11278a0300
permissions -rw-r--r--
support for managed external processes;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/ML-Systems/multithreading.ML
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     4
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     5
Dummy implementation of multithreading interface.
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     6
*)
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
     7
25704
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
     8
signature BASIC_MULTITHREADING =
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
     9
sig
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    10
  val NAMED_CRITICAL: string -> (unit -> 'a) -> 'a
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    11
  val CRITICAL: (unit -> 'a) -> 'a
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    12
end;
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    13
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    14
signature MULTITHREADING =
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    15
sig
25704
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    16
  include BASIC_MULTITHREADING
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    17
  val trace: int ref
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    18
  val tracing: int -> (unit -> string) -> unit
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    19
  val available: bool
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    20
  val max_threads: int ref
25775
90525e67ede7 added Multithreading.max_threads_value, which maps a value of 0 to number of CPUs;
wenzelm
parents: 25735
diff changeset
    21
  val max_threads_value: unit -> int
26074
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    22
  val managed_process: string -> string * bool
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    23
  val self_critical: unit -> bool
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    24
  datatype 'a task =
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    25
    Task of {body: unit -> unit, cont: 'a -> 'a, fail: 'a -> 'a} | Wait | Terminate;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    26
  val schedule: int -> ('a -> 'a task * 'a) -> 'a -> exn list
25704
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    27
  val serial: unit -> int
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    28
  val get_data: 'a Universal.tag -> 'a option
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    29
  val put_data: 'a Universal.tag * 'a -> unit
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    30
end;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    31
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    32
structure Multithreading: MULTITHREADING =
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    33
struct
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    34
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    35
(* options *)
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    36
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    37
val trace = ref (0: int);
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    38
fun tracing _ _ = ();
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    39
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    40
val available = false;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    41
val max_threads = ref (1: int);
25775
90525e67ede7 added Multithreading.max_threads_value, which maps a value of 0 to number of CPUs;
wenzelm
parents: 25735
diff changeset
    42
fun max_threads_value () = Int.max (! max_threads, 1);
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    43
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    44
26074
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    45
(* managed external processes *)
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    46
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    47
fun managed_process _ =
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    48
  raise Fail "No multithreading support -- cannot manage external processes";
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    49
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    50
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    51
(* critical section *)
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    52
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    53
fun self_critical () = false;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    54
fun NAMED_CRITICAL _ e = e ();
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    55
fun CRITICAL e = e ();
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    56
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    57
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    58
(* scheduling *)
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    59
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    60
datatype 'a task =
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    61
  Task of {body: unit -> unit, cont: 'a -> 'a, fail: 'a -> 'a} | Wait | Terminate;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    62
26074
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    63
fun schedule _ _ _ =
44c5419cd9f1 support for managed external processes;
wenzelm
parents: 25775
diff changeset
    64
  raise Fail "No multithreading support -- cannot schedule tasks";
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    65
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    66
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    67
(* serial numbers *)
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    68
25704
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    69
local val count = ref (0: int)
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    70
in fun serial () = (count := ! count + 1; ! count) end;
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    71
25735
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    72
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    73
(* thread data *)
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    74
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    75
local
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    76
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    77
val data = ref ([]: Universal.universal ref list);
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    78
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    79
fun find_data tag =
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    80
  let
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    81
    fun find (r :: rs) = if Universal.tagIs tag (! r) then SOME r else find rs
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    82
      | find [] = NONE;
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    83
  in find (! data) end;
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    84
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    85
in
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    86
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    87
fun get_data tag = Option.map (Universal.tagProject tag o !) (find_data tag);
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    88
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    89
fun put_data (tag, x) =
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    90
  (case find_data tag of
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    91
    SOME r => r := Universal.tagInject tag x
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    92
  | NONE => data := ref (Universal.tagInject tag x) :: ! data);
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    93
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    94
end;
4d147263f71f added get/put_data;
wenzelm
parents: 25704
diff changeset
    95
24690
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    96
end;
c661dae1070a renamed ML-Systems/multithreading_dummy.ML to ML-Systems/multithreading.ML;
wenzelm
parents:
diff changeset
    97
25704
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    98
structure BasicMultithreading: BASIC_MULTITHREADING = Multithreading;
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
    99
open BasicMultithreading;
df9c8074ff09 signature BASIC_MULTITHREADING;
wenzelm
parents: 24690
diff changeset
   100