proc_test: do not overflow preempt_counter on AVR.
[bertos.git] / bertos / struct / list.h
index 62abdc4a83f8bd3a6c319f470a355b061ec05ed3..b970b7cf2d3355af09f9706815a854e029e1d4c1 100644 (file)
@@ -216,6 +216,7 @@ typedef struct _PriNode
        #define INVALIDATE_NODE(n) ((n)->succ = (n)->pred = NULL)
 #else
        #define LIST_ASSERT_VALID(l) do {} while (0)
+       #define LIST_ASSERT_NOT_CONTAINS(list,node) do {} while (0)
        #define INVALIDATE_NODE(n) do {} while (0)
 #endif
 
@@ -275,9 +276,24 @@ typedef struct _PriNode
 /**
  * Insert a priority node in a priority queue.
  *
- * The new node is inserted immediately before the
- * first node with lower priority or appended to
- * the tail if no such node exists.
+ * The new node is inserted immediately before the first node with the same
+ * priority or appended to the tail if no such node exists.
+ */
+#define LIST_ENQUEUE_HEAD(list, node) \
+       do { \
+               PriNode *ln; \
+               LIST_ASSERT_NOT_CONTAINS((list),(node)); \
+               FOREACH_NODE(ln, (list)) \
+                       if (ln->pri <= (node)->pri) \
+                               break; \
+               INSERT_BEFORE(&(node)->link, &ln->link); \
+       } while (0)
+
+/**
+ * Insert a priority node in a priority queue.
+ *
+ * The new node is inserted immediately before the first node with lower
+ * priority or appended to the tail if no such node exists.
  */
 #define LIST_ENQUEUE(list, node) \
        do { \