123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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);
- }
|