alarm.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. static Alarms alarms;
  7. static Rendez alarmr;
  8. void
  9. alarmkproc(void*)
  10. {
  11. Proc *rp;
  12. ulong now;
  13. for(;;){
  14. now = MACHP(0)->ticks;
  15. qlock(&alarms);
  16. while((rp = alarms.head) && rp->alarm <= now){
  17. if(rp->alarm != 0L){
  18. if(canqlock(&rp->debug)){
  19. if(!waserror()){
  20. postnote(rp, 0, "alarm", NUser);
  21. poperror();
  22. }
  23. qunlock(&rp->debug);
  24. rp->alarm = 0L;
  25. }else
  26. break;
  27. }
  28. alarms.head = rp->palarm;
  29. }
  30. qunlock(&alarms);
  31. sleep(&alarmr, return0, 0);
  32. }
  33. }
  34. /*
  35. * called every clock tick
  36. */
  37. void
  38. checkalarms(void)
  39. {
  40. Proc *p;
  41. ulong now;
  42. p = alarms.head;
  43. now = MACHP(0)->ticks;
  44. if(p && p->alarm <= now)
  45. wakeup(&alarmr);
  46. }
  47. ulong
  48. procalarm(ulong time)
  49. {
  50. Proc **l, *f;
  51. ulong when, old;
  52. if(up->alarm)
  53. old = tk2ms(up->alarm - MACHP(0)->ticks);
  54. else
  55. old = 0;
  56. if(time == 0) {
  57. up->alarm = 0;
  58. return old;
  59. }
  60. when = ms2tk(time)+MACHP(0)->ticks;
  61. qlock(&alarms);
  62. l = &alarms.head;
  63. for(f = *l; f; f = f->palarm) {
  64. if(up == f){
  65. *l = f->palarm;
  66. break;
  67. }
  68. l = &f->palarm;
  69. }
  70. up->palarm = 0;
  71. if(alarms.head) {
  72. l = &alarms.head;
  73. for(f = *l; f; f = f->palarm) {
  74. if(f->alarm > when) {
  75. up->palarm = f;
  76. *l = up;
  77. goto done;
  78. }
  79. l = &f->palarm;
  80. }
  81. *l = up;
  82. }
  83. else
  84. alarms.head = up;
  85. done:
  86. up->alarm = when;
  87. qunlock(&alarms);
  88. return old;
  89. }