[systemd-devel] [PATCH v2] shared: rename hasprefix() to startswith(), which is functionally identical and removed

Shawn Landden shawnlandden at gmail.com
Fri Jul 12 08:42:36 PDT 2013


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.
---
 TODO                           |  2 --
 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 -
 8 files changed, 22 insertions(+), 42 deletions(-)

diff --git a/TODO b/TODO
index 5d4ba8f..ad600c2 100644
--- a/TODO
+++ b/TODO
@@ -57,8 +57,6 @@ Features:
 * Get rid of systemd-sysv:
   https://fedoraproject.org/wiki/User:Toshio/Systemd_Convert_draft
 
-* do we really need both hasprefix() and startswith()?
-
 * when a kernel driver logs in a tight loop we should ratelimit that too.
 
 * journald: when we drop syslog messages because the syslog socket is
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



More information about the systemd-devel mailing list