queue.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* $Id$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. #include "top.h"
  7. #include "queue.h"
  8. empty_queue(q)
  9. register queue q;
  10. {
  11. q->head = q->tail = (instr_p) 0;
  12. q->qlen = 0;
  13. }
  14. int empty(q)
  15. queue q;
  16. {
  17. return q->qlen == 0;
  18. }
  19. remove_head(q)
  20. register queue q;
  21. {
  22. if ( (q->head = q->head->fw) == (instr_p) 0) {
  23. q->tail = (instr_p) 0;
  24. } else {
  25. q->head->bw = (instr_p) 0;
  26. }
  27. q->qlen--;
  28. }
  29. add(q,instr)
  30. register queue q;
  31. register instr_p instr;
  32. {
  33. if (q->qlen++ == 0) {
  34. q->head = q->tail = instr;
  35. instr->bw = (instr_p) 0;
  36. } else {
  37. q->tail->fw = instr;
  38. instr->bw = q->tail;
  39. q->tail = instr;
  40. }
  41. instr->fw = (instr_p) 0;
  42. }
  43. insert(q,instr)
  44. register queue q;
  45. register instr_p instr;
  46. {
  47. if (q->qlen++ == 0) {
  48. q->head = q->tail = instr;
  49. instr->fw = (instr_p) 0;
  50. } else {
  51. q->head->bw = instr;
  52. instr->fw = q->head;
  53. q->head = instr;
  54. }
  55. instr->bw = (instr_p) 0;
  56. }
  57. join_queues(q1,q2)
  58. register queue q1,q2;
  59. {
  60. if (q1->qlen > 0) {
  61. q2->qlen += q1->qlen;
  62. q1->tail->fw = q2->head;
  63. if (q2->qlen > 0) {
  64. q2->head->bw = q1->tail;
  65. } else {
  66. q2->tail = q1->tail;
  67. }
  68. q2->head = q1->head;
  69. empty_queue(q1);
  70. }
  71. }