dat.b 1.4 KB

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