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}