blob: d171f211dbec1a27cee912383432988ec83bf2a6 (
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
|
implement Watchvars;
include "watchvars.m";
Watchvar[T].new(v: T): Watchvar
{
e := Watchvar[T](chan[1] of (T, chan of T));
e.c <-= (v, chan[1] of T);
return e;
}
Watchvar[T].get(e: self Watchvar): T
{
(v, ic) := <-e.c;
e.c <-= (v, ic);
return v;
}
Watchvar[T].set(e: self Watchvar, v: T)
{
(nil, ic) := <-e.c;
ic <-= v;
e.c <-= (v, chan[1] of T);
}
Watchvar[T].wait(e: self Watchvar): T
{
(v, ic) := <-e.c;
e.c <-= (v, ic);
v = <-ic;
ic <-= v;
return v;
}
Watchvar[T].waitc(e: self Watchvar): (T, chan of T)
{
vic := <-e.c;
e.c <-= vic;
return vic;
}
Watchvar[T].waited(nil: self Watchvar, ic: chan of T, v: T)
{
ic <-= v;
}
|