(un)likely: use __builtin_expect to inform expected path

Remove also unnecessary comparison in getdata nth_field().

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Sami Kerola 2012-11-11 23:29:07 +00:00
parent 6f179db03d
commit acba2e265e
4 changed files with 25 additions and 3 deletions

View file

@ -69,6 +69,20 @@ AC_CHECK_FUNCS([\
strrchr \ strrchr \
]) ])
AC_MSG_CHECKING([if the compiler supports __builtin_expect])
AC_TRY_COMPILE(, [
return __builtin_expect(1, 1) ? 1 : 0
], [
have_builtin_expect=yes
AC_MSG_RESULT([yes])
], [
have_builtin_expect=no
AC_MSG_RESULT([no])
])
if test x$have_builtin_expect = xyes ; then
AC_DEFINE([HAVE_BUILTIN_EXPECT], [1], [Define to 1 if the compiler supports __builtin_expect.])
fi
AC_CONFIG_FILES([Makefile AC_CONFIG_FILES([Makefile
lib/Makefile lib/Makefile
man/Makefile man/Makefile

View file

@ -93,6 +93,14 @@ inline char *prog_inv_sh_nm_from_file(char *f, char stripext)
# endif # endif
#endif #endif
#ifdef HAVE_BUILTIN_EXPECT
# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)
#else
# define likely(x) (x)
# define unlikely(x) (x)
#endif
/* Structures and unions */ /* Structures and unions */
struct configuration_t { struct configuration_t {
char *dhcpdconf_file; char *dhcpdconf_file;

View file

@ -175,7 +175,7 @@ void nth_field(char *restrict dest, const char *restrict src)
len = strlen(src); len = strlen(src);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
dest[i] = src[i]; dest[i] = src[i];
if (src[i] == ' ' || dest[i] == '\0') { if (unlikely(src[i] == ' ')) {
dest[i] = '\0'; dest[i] = '\0';
break; break;
} }
@ -233,7 +233,7 @@ void parse_config(int is_include, const char *restrict config_file,
#endif /* POSIX_FADV_SEQUENTIAL */ #endif /* POSIX_FADV_SEQUENTIAL */
/* Very hairy stuff begins. */ /* Very hairy stuff begins. */
while (!feof(dhcpd_config)) { while (unlikely(!feof(dhcpd_config))) {
c = fgetc(dhcpd_config); c = fgetc(dhcpd_config);
/* Certain characters are magical */ /* Certain characters are magical */
switch (c) { switch (c) {

View file

@ -55,7 +55,7 @@ int
int i; int i;
/* two spaces are very common in lease file, after them /* two spaces are very common in lease file, after them
* nearly everything differs */ * nearly everything differs */
if (a[2] != b[2]) { if (likely(a[2] != b[2])) {
return false; return false;
} }
/* " binding state " == 16 chars, this will skip right /* " binding state " == 16 chars, this will skip right