Files
net/exec/list.c
2025-12-20 18:49:21 -08:00

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;
}