jiot_list.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "jiot_list.h"
  2. JList_t * initHead()
  3. {
  4. JList_t *self;
  5. if (!(self = jiot_malloc(sizeof(JList_t))))
  6. return NULL;
  7. self->_head = NULL;
  8. self->_tail = NULL;
  9. self->_size = 0;
  10. jiot_mutex_init(&(self->_mtx));
  11. return self;
  12. }
  13. void releaseHead(JList_t *self)
  14. {
  15. jiot_mutex_destory(&(self->_mtx));
  16. jiot_free(self);
  17. }
  18. _JLNode_t *NextNode(JList_t *self,_JLNode_t *node)
  19. {
  20. //node == NULL ,从头节点开始遍历
  21. _JLNode_t *curr = NULL;
  22. if (NULL == node)
  23. {
  24. curr = self->_head;
  25. }
  26. else
  27. {
  28. curr = node->_next;
  29. if (NULL == curr)
  30. {
  31. //遍历到底部,返回NULL
  32. return NULL ;
  33. }
  34. }
  35. return curr;
  36. }
  37. _JLNode_t * PushList(JList_t *self, void * val)
  38. {
  39. jiot_mutex_lock(&(self->_mtx));
  40. if (self->_size >= LIST_MAX)
  41. {
  42. jiot_mutex_unlock(&(self->_mtx));
  43. return NULL;
  44. }
  45. _JLNode_t * node = jiot_malloc(sizeof(JList_t));
  46. if (NULL == node)
  47. {
  48. jiot_mutex_unlock(&(self->_mtx));
  49. return NULL;
  50. }
  51. node->_val = val;
  52. node->_prev = NULL;
  53. node->_next = NULL;
  54. if (self->_size > 0)
  55. {
  56. node->_prev = self->_tail;
  57. self->_tail->_next = node;
  58. self->_tail = node;
  59. }
  60. else
  61. {
  62. self->_head = self->_tail = node;
  63. }
  64. ++self->_size;
  65. jiot_mutex_unlock(&(self->_mtx));
  66. return node;
  67. }
  68. //从head出
  69. _JLNode_t *PopList(JList_t *self)
  70. {
  71. jiot_mutex_lock(&(self->_mtx));
  72. _JLNode_t *node = NULL;
  73. if (!self->_size)
  74. {
  75. jiot_mutex_unlock(&(self->_mtx));
  76. return NULL;
  77. }
  78. node = self->_head;
  79. if (--self->_size)
  80. {
  81. self->_head = node->_next;
  82. self->_head->_prev = NULL;
  83. }
  84. else
  85. {
  86. self->_head = self->_tail = NULL;
  87. }
  88. jiot_mutex_unlock(&(self->_mtx));
  89. node->_next = node->_prev = NULL;
  90. return node;
  91. }
  92. void DelNode(JList_t *self, _JLNode_t *node)
  93. {
  94. jiot_mutex_lock(&(self->_mtx));
  95. if(node->_prev)
  96. {
  97. node->_prev->_next = node->_next;
  98. }
  99. else
  100. {
  101. self->_head = node->_next;
  102. }
  103. if(node->_next)
  104. {
  105. node->_next->_prev = node->_prev;
  106. }
  107. else
  108. {
  109. self->_tail = node->_prev;
  110. }
  111. --self->_size;
  112. jiot_mutex_unlock(&(self->_mtx));
  113. jiot_free(node);
  114. }