#include #include #include #include void NewList(struct List *list, int protect) { switch (protect) { case LP_CLI: NewSemaphore(&list->semaphore, 1, SF_CLI); break; case LP_SPIN: NewSemaphore(&list->semaphore, 1, SF_SPIN); break; case LP_BLOCK: NewSemaphore(&list->semaphore, 1, SF_BLOCK); break; case LP_NONE: default: NewSemaphore(&list->semaphore, 1, SF_NONE); break; } list->head = (struct Node *)&list->tail; list->tail = NULL; list->tailPrev = (struct Node *)&list->head; list->type = 0; list->length = 0; } void Insert(struct List *list, struct Node *node, struct Node *after) { Acquire(&list->semaphore); node->next = after->next; node->prev = after; after->next = node; list->length++; Release(&list->semaphore); } void AddTail(struct List *list, struct Node *node) { Acquire(&list->semaphore); struct Node *tail = (struct Node *)(&list->tail); node->next = tail; node->prev = tail->prev; tail->prev->next = node; tail->prev = node; list->length++; Release(&list->semaphore); } void AddHead(struct List *list, struct Node *node) { Acquire(&list->semaphore); struct Node *head = (struct Node *)(&list->head); node->next = head->next; node->prev = head; head->next->prev = node; head->next = node; list->length++; Release(&list->semaphore); } void Remove(struct List *list, struct Node *node) { Acquire(&list->semaphore); node->next->prev = node->prev; node->prev->next = node->next; list->length--; Release(&list->semaphore); } struct Node *RemHead(struct List *list) { Acquire(&list->semaphore); if (list->length == 0) { Release(&list->semaphore); return NULL; } struct Node *head = (struct Node *)(&list->head); struct Node *node = head->next; head->next = head->next->next; head->next->prev = head; list->length--; Release(&list->semaphore); return node; } struct Node *RemTail(struct List *list) { Acquire(&list->semaphore); struct Node *tail = (struct Node *)(&list->tail); struct Node *node = tail->prev; tail->prev = tail->prev->prev; tail->prev->next = tail; list->length--; Release(&list->semaphore); return node; } struct Node *FindNode(struct List *list, char *name) { Acquire(&list->semaphore); struct Node *node = (struct Node *)(&list->head); while (node->next) { node = node->next; if (node->name && !strcmp(node->name, name)) { Release(&list->semaphore); return node; } } Release(&list->semaphore); return NULL; } void Enqueue(struct List *list, struct Node *node) { Acquire(&list->semaphore); struct Node *comp = (struct Node *)(&list->head); while (comp->next) { comp = comp->next; if (comp->priority < node->priority) { node->next = comp; node->prev = comp->prev; comp->prev = node; list->length++; Release(&list->semaphore); return; } } /* copy of AddTail */ struct Node *tail = (struct Node *)(&list->tail); node->next = tail; node->prev = tail->prev; tail->prev->next = node; tail->prev = node; list->length++; Release(&list->semaphore); } void SetPriority(struct Node *node, int8_t priority) { node->priority = priority; }