diff --git a/include/ucore/tailq.h b/include/ucore/tailq.h index ab4f0e2..3a4acda 100644 --- a/include/ucore/tailq.h +++ b/include/ucore/tailq.h @@ -21,7 +21,8 @@ * Note that unlike the sys/queue.h TAILQ, the list does * not begin/end with a NULL pointer. For a entry node, the beginning/end * is a back pointer to the head node. - * Traditional linked list TailQ + * + * Traditional linked list TailQ * node->prev == NULL node->prev == head * node->next == NULL node->next == head * @@ -69,19 +70,19 @@ static UC_INLINE void uc_tailq_insert(struct TailQ *entry, next->prev = entry; } -/** Insert entry to the tail(end) of the list +/** Insert entry to the tail(end) of the tailq */ static UC_INLINE void uc_tailq_insert_tail(struct TailQ *head, struct TailQ *entry) { - //head becomes entry->next, signalling the end of the list + //head becomes entry->next, signalling the end of the tailq uc_tailq_insert(entry, head->prev, head); } -/** Insert entry to the head(start) of the list +/** Insert entry to the head(start) of the tailq */ static UC_INLINE void uc_tailq_insert_head(struct TailQ *head, struct TailQ *entry) { - //head becomes entry->prev, signalling the end of the list + //head becomes entry->prev, signalling the end of the tailq uc_tailq_insert(entry, head, head->next); } @@ -93,8 +94,8 @@ static UC_INLINE void uc_tailq_link(struct TailQ *first, struct TailQ *second) second->prev = first; } -/** Remove the entry from the list it is part of. - * (It *must* already be part of a list. +/** Remove the entry from the tailq it is part of. + * (It *must* already be part of a tailq. */ static UC_INLINE void uc_tailq_remove(struct TailQ *entry) { @@ -105,7 +106,25 @@ static UC_INLINE void uc_tailq_remove(struct TailQ *entry) entry->prev = (void*)0x102; } -/** Iterate over a tailq. The list cannot be altered while iterating. +/** Move entry from its current tailq to the head of another tailq. + * (entry must be part of a tailq) + */ +static UC_INLINE void uc_tailq_move_head(struct TailQ *entry, struct TailQ *head) +{ + uc_tailq_link(entry->prev, entry->next); + uc_taiq_insert(entry, head, head->next); +} + +/** Move entry from its current tailq to the tail of another tailq. + * (entry must be part of a tailq) + */ +static UC_INLINE void uc_tailq_move_tail(struct TailQ *entry, struct TailQ *head) +{ + uc_tailq_link(entry->prev, entry->next); + uc_taiq_insert(entry, head->prev, head); +} + +/** Iterate over a tailq. The tailq cannot be altered while iterating. * * @param entry a struct TailQ* to which each element is assigned. * @param head the struct TailQ* head of the tailq @@ -113,7 +132,7 @@ static UC_INLINE void uc_tailq_remove(struct TailQ *entry) #define UC_TAILQ_FOREACH(entry, head)\ for ((entry) = (head)->next; (entry) != (head); (entry) = (entry)->next) -/** Iterate over a tailq in reverse order. The list cannot be altered while +/** Iterate over a tailq in reverse order. The tailq cannot be altered while * iterating. * * @param entry a struct TailQ* to which each element is assigned.