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 _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
