summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plist.c6
-rw-r--r--plist.h25
2 files changed, 17 insertions, 14 deletions
diff --git a/plist.c b/plist.c
index 0320b0f..4da76d1 100644
--- a/plist.c
+++ b/plist.c
@@ -31,10 +31,12 @@
#include "plist.h"
void
-plist_add(struct plist *plist, struct plist_node *pnode)
+plist_add(struct plist *plist, struct plist_node *pnode, unsigned int priority)
{
struct plist_node *next;
+ pnode->priority = priority;
+
if (plist_empty(plist)) {
list_insert_head(&plist->list, &pnode->node);
list_insert_head(&plist->prio_list, &pnode->prio_node);
@@ -50,6 +52,8 @@ plist_add(struct plist *plist, struct plist_node *pnode)
if (list_end(&plist->prio_list, &next->prio_node)
|| (pnode->priority != next->priority)) {
list_insert_before(&next->prio_node, &pnode->prio_node);
+ } else {
+ list_init(&pnode->prio_node);
}
list_insert_before(&next->node, &pnode->node);
diff --git a/plist.h b/plist.h
index 4ba8301..07ee3c8 100644
--- a/plist.h
+++ b/plist.h
@@ -142,13 +142,13 @@ plist_prev(const struct plist_node *pnode)
* Get the entry next to the given entry.
*/
#define plist_next_entry(entry, member) \
- list_next_entry(&(entry)->member, node)
+ plist_entry(plist_next(&(entry)->member), typeof(*(entry)), member)
/*
* Get the entry previous to the given entry.
*/
#define plist_prev_entry(entry, member) \
- list_prev_entry(&(entry)->member, node)
+ plist_entry(plist_prev(&(entry)->member), typeof(*(entry)), member)
/*
* Return true if node is after the last or before the first node of
@@ -180,10 +180,9 @@ plist_singular(const struct plist *plist)
/*
* Add a node to a priority list.
- *
- * The node must be initialized before calling this function.
*/
-void plist_add(struct plist *plist, struct plist_node *pnode);
+void plist_add(struct plist *plist, struct plist_node *pnode,
+ unsigned int priority);
/*
* Remove a node from a priority list.
@@ -231,25 +230,25 @@ for (pnode = plist_last(plist), tmp = plist_prev(pnode); \
*
* The entry node must not be altered during the loop.
*/
-#define plist_for_each_entry(plist, entry, member) \
- list_for_each_entry(&(plist)->list, entry, member)
+#define plist_for_each_entry(plist, entry, member) \
+ list_for_each_entry(&(plist)->list, entry, member.node)
/*
* Forge a loop to process all entries of a priority list.
*/
-#define plist_for_each_entry_safe(plist, entry, tmp, member) \
- list_for_each_entry_safe(&(plist)->list, entry, tmp, member)
+#define plist_for_each_entry_safe(plist, entry, tmp, member) \
+ list_for_each_entry_safe(&(plist)->list, entry, tmp, member.node)
/*
* Version of plist_for_each_entry() that processes entries backward.
*/
-#define plist_for_each_entry_reverse(plist, entry, member) \
- list_for_each_entry_reverse(&(plist)->list, entry, member)
+#define plist_for_each_entry_reverse(plist, entry, member) \
+ list_for_each_entry_reverse(&(plist)->list, entry, member.node)
/*
* Version of plist_for_each_entry_safe() that processes entries backward.
*/
-#define plist_for_each_entry_reverse_safe(plist, entry, tmp, member) \
- list_for_each_entry_reverse_safe(&(plist)->list, entry, tmp, member)
+#define plist_for_each_entry_reverse_safe(plist, entry, tmp, member) \
+ list_for_each_entry_reverse_safe(&(plist)->list, entry, tmp, member.node)
#endif /* _PLIST_H */