as most (if not all) of the prefix strings are static, these will get
forward constant propagation optimized into single memcmp() calls, which
should be much better than the non-SIMD hand-rolled version.
---
 src/journal/journal-send.c     |  2 +-
 src/journal/journald-native.c  | 12 ++++++------
 src/libsystemd-bus/bus-match.c | 26 +++++++++++++-------------
 src/shared/logs-show.c         |  2 +-
 src/shared/macro.h             |  2 +-
 src/shared/util.c              | 17 -----------------
 src/shared/util.h              |  1 -
 7 files changed, 22 insertions(+), 40 deletions(-)

diff --git a/src/journal/journal-send.c b/src/journal/journal-send.c
index fef66fc..d00e26f 100644
--- a/src/journal/journal-send.c
+++ b/src/journal/journal-send.c
@@ -245,7 +245,7 @@ _public_ int sd_journal_sendv(const struct iovec *iov, int 
n) {
 
                 have_syslog_identifier = have_syslog_identifier ||
                         (c == (char *) iov[i].iov_base + 17 &&
-                         hasprefix(iov[i].iov_base, "SYSLOG_IDENTIFIER"));
+                         startswith(iov[i].iov_base, "SYSLOG_IDENTIFIER"));
 
                 nl = memchr(iov[i].iov_base, '\n', iov[i].iov_len);
                 if (nl) {
diff --git a/src/journal/journald-native.c b/src/journal/journald-native.c
index 0f9af37..c50cf64 100644
--- a/src/journal/journald-native.c
+++ b/src/journal/journald-native.c
@@ -154,23 +154,23 @@ void server_process_native_message(
                                  * of this entry for the rate limiting
                                  * logic */
                                 if (l == 10 &&
-                                    hasprefix(p, "PRIORITY=") &&
+                                    startswith(p, "PRIORITY=") &&
                                     p[9] >= '0' && p[9] <= '9')
                                         priority = (priority & LOG_FACMASK) | 
(p[9] - '0');
 
                                 else if (l == 17 &&
-                                         hasprefix(p, "SYSLOG_FACILITY=") &&
+                                         startswith(p, "SYSLOG_FACILITY=") &&
                                          p[16] >= '0' && p[16] <= '9')
                                         priority = (priority & LOG_PRIMASK) | 
((p[16] - '0') << 3);
 
                                 else if (l == 18 &&
-                                         hasprefix(p, "SYSLOG_FACILITY=") &&
+                                         startswith(p, "SYSLOG_FACILITY=") &&
                                          p[16] >= '0' && p[16] <= '9' &&
                                          p[17] >= '0' && p[17] <= '9')
                                         priority = (priority & LOG_PRIMASK) | 
(((p[16] - '0')*10 + (p[17] - '0')) << 3);
 
                                 else if (l >= 19 &&
-                                         hasprefix(p, "SYSLOG_IDENTIFIER=")) {
+                                         startswith(p, "SYSLOG_IDENTIFIER=")) {
                                         char *t;
 
                                         t = strndup(p + 18, l - 18);
@@ -179,7 +179,7 @@ void server_process_native_message(
                                                 identifier = t;
                                         }
                                 } else if (l >= 8 &&
-                                           hasprefix(p, "MESSAGE=")) {
+                                           startswith(p, "MESSAGE=")) {
                                         char *t;
 
                                         t = strndup(p + 8, l - 8);
@@ -189,7 +189,7 @@ void server_process_native_message(
                                         }
                                 } else if (l > strlen("OBJECT_PID=") &&
                                            l < strlen("OBJECT_PID=")  + 
DECIMAL_STR_MAX(pid_t) &&
-                                           hasprefix(p, "OBJECT_PID=") &&
+                                           startswith(p, "OBJECT_PID=") &&
                                            allow_object_pid(ucred)) {
                                         char buf[DECIMAL_STR_MAX(pid_t)];
                                         memcpy(buf, p + strlen("OBJECT_PID="), 
l - strlen("OBJECT_PID="));
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c
index 750acfe..1411167 100644
--- a/src/libsystemd-bus/bus-match.c
+++ b/src/libsystemd-bus/bus-match.c
@@ -555,22 +555,22 @@ static int bus_match_find_leaf(
 enum bus_match_node_type bus_match_node_type_from_string(const char *k, size_t 
n) {
         assert(k);
 
-        if (n == 4 && hasprefix(k, "type"))
+        if (n == 4 && startswith(k, "type"))
                 return BUS_MATCH_MESSAGE_TYPE;
-        if (n == 6 && hasprefix(k, "sender"))
+        if (n == 6 && startswith(k, "sender"))
                 return BUS_MATCH_SENDER;
-        if (n == 11 && hasprefix(k, "destination"))
+        if (n == 11 && startswith(k, "destination"))
                 return BUS_MATCH_DESTINATION;
-        if (n == 9 && hasprefix(k, "interface"))
+        if (n == 9 && startswith(k, "interface"))
                 return BUS_MATCH_INTERFACE;
-        if (n == 6 && hasprefix(k, "member"))
+        if (n == 6 && startswith(k, "member"))
                 return BUS_MATCH_MEMBER;
-        if (n == 4 && hasprefix(k, "path"))
+        if (n == 4 && startswith(k, "path"))
                 return BUS_MATCH_PATH;
-        if (n == 14 && hasprefix(k, "path_namespace"))
+        if (n == 14 && startswith(k, "path_namespace"))
                 return BUS_MATCH_PATH_NAMESPACE;
 
-        if (n == 4 && hasprefix(k, "arg")) {
+        if (n == 4 && startswith(k, "arg")) {
                 int j;
 
                 j = undecchar(k[3]);
@@ -580,7 +580,7 @@ enum bus_match_node_type 
bus_match_node_type_from_string(const char *k, size_t n
                 return BUS_MATCH_ARG + j;
         }
 
-        if (n == 5 && hasprefix(k, "arg")) {
+        if (n == 5 && startswith(k, "arg")) {
                 int a, b;
                 enum bus_match_node_type t;
 
@@ -596,7 +596,7 @@ enum bus_match_node_type 
bus_match_node_type_from_string(const char *k, size_t n
                 return t;
         }
 
-        if (n == 8 && hasprefix(k, "arg") && hasprefix(k + 4, "path")) {
+        if (n == 8 && startswith(k, "arg") && startswith(k + 4, "path")) {
                 int j;
 
                 j = undecchar(k[3]);
@@ -606,7 +606,7 @@ enum bus_match_node_type 
bus_match_node_type_from_string(const char *k, size_t n
                 return BUS_MATCH_ARG_PATH + j;
         }
 
-        if (n == 9 && hasprefix(k, "arg") && hasprefix(k + 5, "path")) {
+        if (n == 9 && startswith(k, "arg") && startswith(k + 5, "path")) {
                 enum bus_match_node_type t;
                 int a, b;
 
@@ -622,7 +622,7 @@ enum bus_match_node_type 
bus_match_node_type_from_string(const char *k, size_t n
                 return t;
         }
 
-        if (n == 13 && hasprefix(k, "arg") && hasprefix(k + 4, "namespace")) {
+        if (n == 13 && startswith(k, "arg") && startswith(k + 4, "namespace")) 
{
                 int j;
 
                 j = undecchar(k[3]);
@@ -632,7 +632,7 @@ enum bus_match_node_type 
bus_match_node_type_from_string(const char *k, size_t n
                 return BUS_MATCH_ARG_NAMESPACE + j;
         }
 
-        if (n == 14 && hasprefix(k, "arg") && hasprefix(k + 5, "namespace")) {
+        if (n == 14 && startswith(k, "arg") && startswith(k + 5, "namespace")) 
{
                 enum bus_match_node_type t;
                 int a, b;
 
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index 8dc11bb..d960bfa 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -449,7 +449,7 @@ static int output_export(
                 /* We already printed the boot id, from the data in
                  * the header, hence let's suppress it here */
                 if (length >= 9 &&
-                    hasprefix(data, "_BOOT_ID="))
+                    startswith(data, "_BOOT_ID="))
                         continue;
 
                 if (!utf8_is_printable(data, length)) {
diff --git a/src/shared/macro.h b/src/shared/macro.h
index 969329d..3925977 100644
--- a/src/shared/macro.h
+++ b/src/shared/macro.h
@@ -186,7 +186,7 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
 
 #define char_array_0(x) x[sizeof(x)-1] = 0;
 
-#define hasprefix(s, prefix) (memcmp(s, prefix, strlen(prefix)) == 0)
+#define startswith(s, prefix) (memcmp(s, prefix, strlen(prefix)) == 0)
 
 #define IOVEC_SET_STRING(i, s)                  \
         do {                                    \
diff --git a/src/shared/util.c b/src/shared/util.c
index ceee6f2..97c2f9e 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -128,23 +128,6 @@ char* endswith(const char *s, const char *postfix) {
         return (char*) s + sl - pl;
 }
 
-char* startswith(const char *s, const char *prefix) {
-        const char *a, *b;
-
-        assert(s);
-        assert(prefix);
-
-        a = s, b = prefix;
-        for (;;) {
-                if (*b == 0)
-                        return (char*) a;
-                if (*a != *b)
-                        return NULL;
-
-                a++, b++;
-        }
-}
-
 char* startswith_no_case(const char *s, const char *prefix) {
         const char *a, *b;
 
diff --git a/src/shared/util.h b/src/shared/util.h
index ddb21b4..d975675 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -107,7 +107,6 @@ static inline bool isempty(const char *p) {
 }
 
 char *endswith(const char *s, const char *postfix) _pure_;
-char *startswith(const char *s, const char *prefix) _pure_;
 char *startswith_no_case(const char *s, const char *prefix) _pure_;
 
 bool first_word(const char *s, const char *word) _pure_;
-- 
1.8.3.2

_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to