xref: /inferno-os/appl/acme/dat.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1implement Dat;
2
3include "common.m";
4
5sys : Sys;
6acme : Acme;
7utils : Utils;
8
9# lc, uc : chan of ref Lock;
10
11init(mods : ref Dat->Mods)
12{
13	sys = mods.sys;
14	acme = mods.acme;
15	utils = mods.utils;
16
17	mouse = ref Draw->Pointer;
18	mouse.buttons = mouse.msec = 0;
19	mouse.xy = (0, 0);
20	# lc = chan of ref Lock;
21	# uc = chan of ref Lock;
22	# spawn lockmgr();
23}
24
25# lockmgr()
26# {
27# 	l : ref Lock;
28#
29# 	acme->lockpid = sys->pctl(0, nil);
30# 	for (;;) {
31# 		alt {
32# 			l = <- lc =>
33# 				if (l.cnt++ == 0)
34# 					l.chann <-= 1;
35# 			l = <- uc =>
36# 				if (--l.cnt > 0)
37# 					l.chann <-= 1;
38# 		}
39# 	}
40# }
41
42Lock.init() : ref Lock
43{
44	return ref Lock(0, chan[1] of int);
45	# return ref Lock(0, chan of int);
46}
47
48Lock.lock(l : self ref Lock)
49{
50	l.cnt++;
51	l.chann <-= 0;
52	# lc <-= l;
53	# <- l.chann;
54}
55
56Lock.unlock(l : self ref Lock)
57{
58	<-l.chann;
59	l.cnt--;
60	# uc <-= l;
61}
62
63Lock.locked(l : self ref Lock) : int
64{
65	return l.cnt > 0;
66}
67
68Ref.init() : ref Ref
69{
70	r := ref Ref;
71	r.l = Lock.init();
72	r.cnt = 0;
73	return r;
74}
75
76Ref.inc(r : self ref Ref) : int
77{
78	r.l.lock();
79	i := r.cnt;
80	r.cnt++;
81	r.l.unlock();
82	return i;
83}
84
85Ref.dec(r : self ref Ref) : int
86{
87	r.l.lock();
88	r.cnt--;
89	i := r.cnt;
90	r.l.unlock();
91	return i;
92}
93
94Ref.refx(r : self ref Ref) : int
95{
96	return r.cnt;
97}
98
99Reffont.get(p, q, r : int, b : string) : ref Reffont
100{
101	return acme->get(p, q, r, b);
102}
103
104Reffont.close(r : self ref Reffont)
105{
106	return acme->close(r);
107}