diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-08-08 15:35:10 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2008-08-08 15:35:10 -0700 |
commit | ebc04ce20a871c99dbb116a4fbada967dd750c43 (patch) | |
tree | 98219547f096f6d438752e4f050daa25d040970a /lib | |
parent | 9aa7ce77e8aed80057c559d4bf926188c1cf7a32 (diff) | |
download | quagga-ebc04ce20a871c99dbb116a4fbada967dd750c43.tar.bz2 quagga-ebc04ce20a871c99dbb116a4fbada967dd750c43.tar.xz |
Add compiler directive to mark code paths that log as cold
This causes compiler to naturally favor faster path through code.
Anything that logs a message is not fast path.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/log.h | 37 | ||||
-rw-r--r-- | lib/vty.h | 7 |
2 files changed, 26 insertions, 18 deletions
@@ -105,33 +105,48 @@ extern void closezlog (struct zlog *zl); /* GCC have printf type attribute check. */ #ifdef __GNUC__ -#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b))) +#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((format (printf, a, b))) #else #define PRINTF_ATTRIBUTE(a,b) #endif /* __GNUC__ */ +#if !(__GNUC__ == 4) +/* Mark functions as cold. gcc will assume any path leading to a call + to them will be unlikely. This means a lot of paths leading up + to log messages are easily marked as not likely. +*/ +#define COLD_ATTRIBUTE __attribute__((__cold__)) +#else +#define COLD_ATTRIBUTE +#endif + /* Generic function for zlog. */ extern void zlog (struct zlog *zl, int priority, const char *format, ...) PRINTF_ATTRIBUTE(3, 4); /* Handy zlog functions. */ -extern void zlog_err (const char *format, ...) PRINTF_ATTRIBUTE(1, 2); -extern void zlog_warn (const char *format, ...) PRINTF_ATTRIBUTE(1, 2); -extern void zlog_info (const char *format, ...) PRINTF_ATTRIBUTE(1, 2); -extern void zlog_notice (const char *format, ...) PRINTF_ATTRIBUTE(1, 2); -extern void zlog_debug (const char *format, ...) PRINTF_ATTRIBUTE(1, 2); +extern void zlog_err (const char *format, ...) + PRINTF_ATTRIBUTE(1, 2) COLD_ATTRIBUTE; +extern void zlog_warn (const char *format, ...) + PRINTF_ATTRIBUTE(1, 2) COLD_ATTRIBUTE; +extern void zlog_info (const char *format, ...) + PRINTF_ATTRIBUTE(1, 2) COLD_ATTRIBUTE; +extern void zlog_notice (const char *format, ...) + PRINTF_ATTRIBUTE(1, 2) COLD_ATTRIBUTE; +extern void zlog_debug (const char *format, ...) + PRINTF_ATTRIBUTE(1, 2) COLD_ATTRIBUTE; /* For bgpd's peer oriented log. */ extern void plog_err (struct zlog *, const char *format, ...) - PRINTF_ATTRIBUTE(2, 3); + PRINTF_ATTRIBUTE(2, 3) COLD_ATTRIBUTE; extern void plog_warn (struct zlog *, const char *format, ...) - PRINTF_ATTRIBUTE(2, 3); + PRINTF_ATTRIBUTE(2, 3) COLD_ATTRIBUTE; extern void plog_info (struct zlog *, const char *format, ...) - PRINTF_ATTRIBUTE(2, 3); + PRINTF_ATTRIBUTE(2, 3) COLD_ATTRIBUTE; extern void plog_notice (struct zlog *, const char *format, ...) - PRINTF_ATTRIBUTE(2, 3); + PRINTF_ATTRIBUTE(2, 3) COLD_ATTRIBUTE; extern void plog_debug (struct zlog *, const char *format, ...) - PRINTF_ATTRIBUTE(2, 3); + PRINTF_ATTRIBUTE(2, 3) COLD_ATTRIBUTE; /* Set logging level for the given destination. If the log_level argument is ZLOG_DISABLED, then the destination is disabled. @@ -141,13 +141,6 @@ struct vty #define IS_DIRECTORY_SEP(c) ((c) == DIRECTORY_SEP) #endif -/* GCC have printf type attribute check. */ -#ifdef __GNUC__ -#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b))) -#else -#define PRINTF_ATTRIBUTE(a,b) -#endif /* __GNUC__ */ - /* Utility macros to convert VTY argument to unsigned long or integer. */ #define VTY_GET_LONG(NAME,V,STR) \ do { \ |