137 lines
3.5 KiB
C
137 lines
3.5 KiB
C
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <exec/sync.h>
|
|
#include <exec/list.h>
|
|
|
|
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;
|
|
} |