forked from ocaml/ocaml
/
condition.ml
31 lines (25 loc) · 1.14 KB
/
condition.ml
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
(***********************************************************************)
(* *)
(* Caml Special Light *)
(* *)
(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
(* *)
(* Copyright 1995 Institut National de Recherche en Informatique et *)
(* Automatique. Distributed only by permission. *)
(* *)
(***********************************************************************)
(* $Id$ *)
type t =
{ mutable cond_waiting: t list }
let new () = { cond_waiting = [] }
let wait cond lock =
cond.cond_waiting <- Thread.self() :: cond.cond_waiting;
Mutex.unlock lock;
Thread.sleep()
let signal cond =
match cond.cond_waiting with
[] -> ()
| pid :: rem -> Thread.wakeup pid; cond.cond_waiting <- rem
let broadcast cond =
List.iter Thread.wakeup cond.cond_waiting;
cond.cond_waiting <- []