node.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "c_string.h"
  2. #include "c_stdlib.h"
  3. #include "node.h"
  4. static inline coap_queue_t *
  5. coap_malloc_node(void) {
  6. return (coap_queue_t *)c_zalloc(sizeof(coap_queue_t));
  7. }
  8. void coap_free_node(coap_queue_t *node) {
  9. c_free(node);
  10. }
  11. int coap_insert_node(coap_queue_t **queue, coap_queue_t *node) {
  12. coap_queue_t *p, *q;
  13. if ( !queue || !node )
  14. return 0;
  15. /* set queue head if empty */
  16. if ( !*queue ) {
  17. *queue = node;
  18. return 1;
  19. }
  20. /* replace queue head if PDU's time is less than head's time */
  21. q = *queue;
  22. if (node->t < q->t) {
  23. node->next = q;
  24. *queue = node;
  25. q->t -= node->t; /* make q->t relative to node->t */
  26. return 1;
  27. }
  28. /* search for right place to insert */
  29. do {
  30. node->t -= q->t; /* make node-> relative to q->t */
  31. p = q;
  32. q = q->next;
  33. } while (q && q->t <= node->t);
  34. /* insert new item */
  35. if (q) {
  36. q->t -= node->t; /* make q->t relative to node->t */
  37. }
  38. node->next = q;
  39. p->next = node;
  40. return 1;
  41. }
  42. int coap_delete_node(coap_queue_t *node) {
  43. if ( !node )
  44. return 0;
  45. coap_delete_pdu(node->pdu);
  46. coap_free_node(node);
  47. return 1;
  48. }
  49. void coap_delete_all(coap_queue_t *queue) {
  50. if ( !queue )
  51. return;
  52. coap_delete_all( queue->next );
  53. coap_delete_node( queue );
  54. }
  55. coap_queue_t * coap_new_node(void) {
  56. coap_queue_t *node;
  57. node = coap_malloc_node();
  58. if ( ! node ) {
  59. return NULL;
  60. }
  61. c_memset(node, 0, sizeof(*node));
  62. return node;
  63. }
  64. coap_queue_t * coap_peek_next( coap_queue_t *queue ) {
  65. if ( !queue )
  66. return NULL;
  67. return queue;
  68. }
  69. coap_queue_t * coap_pop_next( coap_queue_t **queue ) { // this function is called inside timeout callback only.
  70. coap_queue_t *next;
  71. if ( !(*queue) )
  72. return NULL;
  73. next = *queue;
  74. *queue = (*queue)->next;
  75. // if (queue) {
  76. // queue->t += next->t;
  77. // }
  78. next->next = NULL;
  79. return next;
  80. }
  81. int coap_remove_node( coap_queue_t **queue, const coap_tid_t id){
  82. coap_queue_t *p, *q, *node;
  83. if ( !queue )
  84. return 0;
  85. if ( !*queue ) // if empty
  86. return 0;
  87. q = *queue;
  88. if (q->id == id) {
  89. node = q;
  90. *queue = q->next;
  91. node->next = NULL;
  92. if(*queue){
  93. (*queue)->t += node->t;
  94. }
  95. coap_delete_node(node);
  96. return 1;
  97. }
  98. /* search for right node to remove */
  99. while (q && q->id != id) {
  100. p = q;
  101. q = q->next;
  102. }
  103. /* find the node */
  104. if (q) {
  105. node = q; /* save the node */
  106. p->next = q->next; /* remove the node */
  107. q = q->next;
  108. node->next = NULL;
  109. if (q) // add node->t to the node after.
  110. {
  111. q->t += node->t;
  112. }
  113. coap_delete_node(node);
  114. return 1;
  115. }
  116. return 0;
  117. }