Advertisement
NaZaRa

Untitled

Jan 11th, 2019
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1. //----------------------------------------------------------------------------//
  2. // GNU GPL OS/K //
  3. // //
  4. // Authors: spectral` //
  5. // NeoX //
  6. // //
  7. // Desc: Kaleid C runtime library //
  8. //----------------------------------------------------------------------------//
  9.  
  10. #ifndef _KALLIST_H
  11. #define _KALLIST_H
  12.  
  13. #ifdef _KALEID_KERNEL
  14. #error "kallist.h - Not ready for kernel compilation"
  15. #endif
  16.  
  17. #ifndef _KALASSRT_H
  18. #include <common/kalassrt.h>
  19. #endif
  20.  
  21. #ifndef _KALKERN_LOCKS_H
  22. #include <kernel/kernlocks.h>
  23. #endif
  24.  
  25. //
  26. // XXX ¯\_(ツ)_/¯
  27. //
  28. void *malloc(long);
  29. void free(void *);
  30.  
  31. //------------------------------------------//
  32. // Data structures //
  33. //------------------------------------------//
  34.  
  35. typedef struct sListHead_t {
  36. bool mLock; // malloc()-ed lock?
  37. Lock_t *lock;
  38. unsigned long length;
  39. struct sListNode_t *first;
  40. struct sListNode_t *last;
  41. } ListHead_t;
  42.  
  43. typedef struct sListNode_t {
  44. void *data;
  45. ListHead_t *head;
  46. struct sListNode_t *prev;
  47. struct sListNode_t *next;
  48. } ListNode_t;
  49.  
  50. //------------------------------------------//
  51. // Functions //
  52. //------------------------------------------//
  53.  
  54. //
  55. // Create a list head with an extern lock
  56. //
  57. static inline ListHead_t
  58. *CreateListHeadWithLock(Lock_t *lock, bool toBeFreed)
  59. {
  60. ListHead_t *head = malloc(sizeof(ListHead_t));
  61.  
  62. if (head == NULL) return NULL;
  63.  
  64. head->first = head->last = NULL;
  65. head->length = 0;
  66.  
  67. head->lock = lock;
  68. head->mLock = toBeFreed;
  69.  
  70. return head;
  71. }
  72.  
  73. //
  74. // Create a liste head
  75. //
  76. static inline ListHead_t
  77. *CreateListHead(void)
  78. {
  79. Lock_t *lock = malloc(sizeof(Lock_t));
  80. InitLock(lock, KLOCK_MUTEX);
  81.  
  82. return CreateListHeadWithLock(lock, TRUE);
  83. }
  84.  
  85. //
  86. // Create a node
  87. //
  88. static inline ListNode_t
  89. *CreateNode(void *data)
  90. {
  91. ListNode_t *node = malloc(sizeof(ListNode_t));
  92.  
  93. if (node == NULL) return NULL;
  94.  
  95. node->data = data;
  96. node->head = NULL;
  97. node->prev = node->next = NULL;
  98.  
  99. return node;
  100. }
  101.  
  102. //
  103. // Prepend node at beginning of list
  104. //
  105. static inline ListHead_t
  106. *PrependNode(ListHead_t *head, ListNode_t *node)
  107. {
  108. assert(head && node);
  109.  
  110. node->head = head;
  111. node->prev = NULL;
  112.  
  113. if (head->length > 0) {
  114. node->next = head->first;
  115. head->first->prev = node;
  116. head->first = node;
  117. }
  118.  
  119. else {
  120. head->first = node;
  121. head->last = node;
  122. node->next = NULL;
  123. }
  124.  
  125. head->length++;
  126.  
  127. return head;
  128. }
  129.  
  130. //
  131. // Append node at end of list
  132. //
  133. static inline ListHead_t
  134. *AppendNode(ListHead_t *head, ListNode_t *node)
  135. {
  136. assert(head && node);
  137.  
  138. node->head = head;
  139. node->next = NULL;
  140.  
  141. if (head->length > 0) {
  142. node->prev = head->last;
  143. head->last->next = node;
  144. head->last = node;
  145. }
  146.  
  147. else {
  148. head->first = node;
  149. head->last = node;
  150. node->prev = NULL;
  151. }
  152.  
  153. head->length++;
  154.  
  155. return head;
  156. }
  157.  
  158. //
  159. // Insert node2 before node1
  160. //
  161. static inline ListHead_t
  162. *AddNodeBefore(ListHead_t *head, ListNode_t *node1, ListNode_t *node2)
  163. {
  164. assert(head && node1 && node2 && node1->head == head);
  165.  
  166. if (head->first == node1) {
  167. return PrependNode(head, node2);
  168. }
  169.  
  170. node2->head = head;
  171. node2->next = node1;
  172. node2->prev = node1->prev;
  173.  
  174. // node1->prev does exist
  175. // or node1 would be first
  176. node1->prev->next = node2;
  177. node1->prev = node2;
  178.  
  179. head->length++;
  180.  
  181. return head;
  182. }
  183.  
  184. //
  185. // Insert node2 after node1
  186. //
  187. static inline ListHead_t
  188. *AddNodeAfter(ListHead_t *head, ListNode_t *node1, ListNode_t *node2)
  189. {
  190. assert(head && node1 && node2 && node1->head == head);
  191.  
  192. if (head->last == node1) {
  193. return AppendNode(head, node2);
  194. }
  195.  
  196. node2->head = head;
  197. node2->prev = node1;
  198. node2->next = node1->next;
  199.  
  200. node1->next->prev = node2;
  201. node1->next = node2;
  202.  
  203. head->length++;
  204.  
  205. return head;
  206. }
  207.  
  208. //
  209. // Remove node of list
  210. //
  211. static inline ListHead_t
  212. *RemoveNode(ListHead_t *head, ListNode_t *node)
  213. {
  214. assert(head && node && head->length > 0 && node->head == head);
  215.  
  216. if (head->length == 1) {
  217. head->first = head->last = NULL;
  218. goto leave;
  219. }
  220.  
  221. if (head->first == node) {
  222. head->first = node->next;
  223. node->next->prev = NULL;
  224. }
  225.  
  226. else if (head->last == node) {
  227. head->last = node->prev;
  228. node->prev->next = NULL;
  229. }
  230.  
  231. else {
  232. node->prev->next = node->next;
  233. node->next->prev = node->prev;
  234. }
  235.  
  236. leave:
  237. head->length--;
  238. free(node);
  239.  
  240. return head;
  241.  
  242. }
  243.  
  244. //
  245. // Free a node
  246. //
  247. static inline void
  248. DestroyNode(ListNode_t *node)
  249. {
  250. free(node);
  251. }
  252.  
  253. //
  254. // Free a list head
  255. //
  256. static inline void
  257. DestroyListHead(ListHead_t *head)
  258. {
  259. KalAssert(head);
  260.  
  261. if (head->mLock) {
  262. free((void *)head->lock);
  263. }
  264.  
  265. free(head);
  266. }
  267.  
  268. //
  269. // Access a node's data
  270. //
  271. #define GetNodeData(node, type) ((type)(node)->data)
  272.  
  273. //------------------------------------------//
  274. // End of header //
  275. //------------------------------------------//
  276.  
  277. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement