File: Test166.ML

package info (click to toggle)
polyml 5.7.1-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 40,616 kB
  • sloc: cpp: 44,142; ansic: 26,963; sh: 22,002; asm: 13,486; makefile: 602; exp: 525; python: 253; awk: 91
file content (66 lines) | stat: -rw-r--r-- 1,262 bytes parent folder | download | duplicates (4)
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
(* Test for condition variables. *)

open Thread;
open Thread Mutex ConditionVar;

val avar = conditionVar()
and amutex = mutex();

val bvar = conditionVar();

val cvar = conditionVar();

val dvar = conditionVar();

val stop = ref false

val avalue = ref 0

fun incValue threadNo () =
let
    val () = lock amutex
    fun loop() =
        (
            wait(avar, amutex);
            if ! stop
            then ()
            else
            (
                avalue := !avalue + 1;
                signal bvar;
                loop()
            )
        )
in
    signal dvar;
    loop();
    signal cvar;
    unlock amutex
end;

fun addCount 0 = ()
|   addCount n =
    (
        signal avar;
        wait(bvar, amutex);
        addCount (n-1)
    );

lock amutex;
fork(incValue 1, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);
fork(incValue 2, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);
fork(incValue 3, [EnableBroadcastInterrupt true, InterruptState InterruptSynch]);

wait(dvar, amutex);
addCount 10000;
OS.Process.sleep(Time.fromSeconds 2);

stop := true;
signal avar;
wait(cvar, amutex);
signal avar;
wait(cvar, amutex);
signal avar;
wait(cvar, amutex);

if !avalue = 10000 then () else raise Fail "Incorrect";