123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #include <kern/pqueue.h>
- void
- pqueue_insert (struct pqueue *pq, struct pqueue_node *node)
- {
- struct pqueue_node *head = pq->head;
- if (! head)
- {
- node->prev = node->next = node;
- pq->head = node;
- }
- else if (head->prio < node->prio)
- {
- node->prev = head->prev;
- node->next = head;
- node->prev->next = node;
- node->next->prev = node;
- node->next->prio = node->prio - node->next->prio;
- pq->head = node;
- }
- else
- {
- uint32_t prio = head->prio;
- while (prio - head->next->prio >= node->prio && head->next != pq->head)
- {
- head = head->next;
- prio -= head->prio;
- }
- node->prev = head;
- node->next = head->next;
- node->prev->next = node;
- node->next->prev = node;
- node->prio = prio - node->prio;
- if (node->next != pq->head)
- node->next->prio -= node->prio;
- }
- }
- struct pqueue_node*
- pqueue_pop (struct pqueue *pq)
- {
- struct pqueue_node *node = pq->head;
- if (! node)
- return (node);
- else if (node->next == node)
- {
- pq->head = NULL;
- return (node);
- }
- node->prev->next = node->next;
- node->next->prev = node->prev;
- node->next->prio = node->prio - node->next->prio;
- pq->head = node->next;
- return (node);
- }
- void
- pqueue_remove (struct pqueue *pq, struct pqueue_node *node)
- {
- if (!pq->head)
- return;
- else if (pq->head != node)
- {
- node->prev->next = node->next;
- node->next->prev = node->prev;
- if (node->next != pq->head)
- node->next->prio += node->prio;
- }
- else if (node->next == node)
- {
- node->next = node->prev = NULL;
- pq->head = NULL;
- }
- else
- {
- node->prev->next = node->next;
- node->next->prev = node->prev;
- node->next->prio = node->prio - node->next->prio;
- pq->head = node->next;
- }
- }
|