ref: 2459e34d77e2e21ef829c0dfaafd99433899494f
dir: /appl/acme/dat.b/
implement Dat;
include "common.m";
sys : Sys;
acme : Acme;
utils : Utils;
# lc, uc : chan of ref Lock;
init(mods : ref Dat->Mods)
{
sys = mods.sys;
acme = mods.acme;
utils = mods.utils;
mouse = ref Draw->Pointer;
mouse.buttons = mouse.msec = 0;
mouse.xy = (0, 0);
# lc = chan of ref Lock;
# uc = chan of ref Lock;
# spawn lockmgr();
}
# lockmgr()
# {
# l : ref Lock;
#
# acme->lockpid = sys->pctl(0, nil);
# for (;;) {
# alt {
# l = <- lc =>
# if (l.cnt++ == 0)
# l.chann <-= 1;
# l = <- uc =>
# if (--l.cnt > 0)
# l.chann <-= 1;
# }
# }
# }
Lock.init() : ref Lock
{
return ref Lock(0, chan[1] of int);
# return ref Lock(0, chan of int);
}
Lock.lock(l : self ref Lock)
{
l.cnt++;
l.chann <-= 0;
# lc <-= l;
# <- l.chann;
}
Lock.unlock(l : self ref Lock)
{
<-l.chann;
l.cnt--;
# uc <-= l;
}
Lock.locked(l : self ref Lock) : int
{
return l.cnt > 0;
}
Ref.init() : ref Ref
{
r := ref Ref;
r.l = Lock.init();
r.cnt = 0;
return r;
}
Ref.inc(r : self ref Ref) : int
{
r.l.lock();
i := r.cnt;
r.cnt++;
r.l.unlock();
return i;
}
Ref.dec(r : self ref Ref) : int
{
r.l.lock();
r.cnt--;
i := r.cnt;
r.l.unlock();
return i;
}
Ref.refx(r : self ref Ref) : int
{
return r.cnt;
}
Reffont.get(p, q, r : int, b : string) : ref Reffont
{
return acme->get(p, q, r, b);
}
Reffont.close(r : self ref Reffont)
{
return acme->close(r);
}