blob: e7d528f6468df83fb5b2f8c850cf280dbc3633df (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
(***********************************************************************)
(* *)
(* Objective Caml *)
(* *)
(* Xavier Leroy and Pascal Cuoq, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1996 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed *)
(* under the terms of the GNU Library General Public License, with *)
(* the special exception on linking described in file ../../LICENSE. *)
(* *)
(***********************************************************************)
(* $Id: thread_posix.ml 9547 2010-01-22 12:48:24Z doligez $ *)
(* User-level threads *)
type t
external thread_initialize : unit -> unit = "caml_thread_initialize"
external thread_new : (unit -> unit) -> t = "caml_thread_new"
external thread_uncaught_exception : exn -> unit =
"caml_thread_uncaught_exception"
external yield : unit -> unit = "caml_thread_yield"
external self : unit -> t = "caml_thread_self"
external id : t -> int = "caml_thread_id"
external join : t -> unit = "caml_thread_join"
external exit : unit -> unit = "caml_thread_exit"
(* For new, make sure the function passed to thread_new never
raises an exception. *)
let create fn arg =
thread_new
(fun () ->
try
fn arg; ()
with exn ->
flush stdout; flush stderr;
thread_uncaught_exception exn)
(* Thread.kill is currently not implemented due to problems with
cleanup handlers on several platforms *)
let kill th = invalid_arg "Thread.kill: not implemented"
(* Preemption *)
let preempt signal = yield()
(* Initialization of the scheduler *)
let preempt_signal =
match Sys.os_type with
| "Win32" -> Sys.sigterm
| _ -> Sys.sigvtalrm
let _ =
ignore(Sys.signal preempt_signal (Sys.Signal_handle preempt));
thread_initialize()
(* Wait functions *)
let delay time = ignore(Unix.select [] [] [] time)
let wait_read fd = ()
let wait_write fd = ()
let wait_timed_read fd d =
match Unix.select [fd] [] [] d with ([], _, _) -> false | (_, _, _) -> true
let wait_timed_write fd d =
match Unix.select [] [fd] [] d with (_, [], _) -> false | (_, _, _) -> true
let select = Unix.select
let wait_pid p = Unix.waitpid [] p
external sigmask : Unix.sigprocmask_command -> int list -> int list = "caml_thread_sigmask"
external wait_signal : int list -> int = "caml_wait_signal"
|