summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-05 00:56:03 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-06-10 10:10:06 -0400
commit2bc8ca0ca2fefcfb63a37723d7a9bbb9ae76ceb1 (patch)
tree2a0647e78377f9b27d8b4b3e37af040c012ccce2 /src/shared
parent3f3a438f58d7b1d2ba2b44d6d356fb1eaa65b66a (diff)
journal: loop less in MATCH_AND_TERM conditionals
AND term usually don't have many subterms (4 seems to be the maximum sensible number, e.g. _BOOT_ID && _SYSTEMD_UNIT && _PID && MESSAGE_ID). Nevertheless, the cost of checking each subterm can be relatively high, especially when the nested terms are compound, and it makes sense to minimize the number of checks. Instead of looping to the end and then again over the whole list once again after at least one term changed the offset, start the loop at the term which caused the change. This way ½ terms in the AND match are not checked unnecessarily again.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/list.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/shared/list.h b/src/shared/list.h
index 47f275a019..96d6237974 100644
--- a/src/shared/list.h
+++ b/src/shared/list.h
@@ -123,3 +123,10 @@
#define LIST_FOREACH_AFTER(name,i,p) \
for ((i) = (p)->name##_next; (i); (i) = (i)->name##_next)
+
+/* Loop starting from p->next until p->prev.
+ p can be adjusted meanwhile. */
+#define LIST_LOOP_BUT_ONE(name,i,head,p) \
+ for ((i) = (p)->name##_next ? (p)->name##_next : (head); \
+ (i) != (p); \
+ (i) = (i)->name##_next ? (i)->name##_next : (head))