From 41190343562493449a1801fa5a7eecf181b8656e Mon Sep 17 00:00:00 2001 From: Gediminas Jakutis Date: Tue, 1 Oct 2019 15:18:09 +0300 Subject: diagnostics: add more prefixes. This also starts preparations for overhaul of this subsystem. Signed-off-by: Gediminas Jakutis --- include/rin/diagnostic.h | 11 +++++++ src/diagnostic/diagnostic.c | 58 +++++++++++++++++++++++++++++++++---- src/diagnostic/diagnostic_private.h | 14 +++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) diff --git a/include/rin/diagnostic.h b/include/rin/diagnostic.h index 5101d88..4ac071e 100644 --- a/include/rin/diagnostic.h +++ b/include/rin/diagnostic.h @@ -21,6 +21,17 @@ #ifndef LIBRIN_DIAGNOSTIC_INCLUDED #define LIBRIN_DIAGNOSTIC_INCLUDED +#define RIN_DIAG_SET 1 +#define RIN_DIAG_UNSET 0 +#define RIN_DIAG_PREFIX (1 << 0) +#define RIN_DIAG_TIME (1 << 1) +#define RIN_DIAG_THREADNUM (1 << 2) +#define RIN_DIAG_ALLFLAGS ( RIN_DIAG_PREFIX | \ + RIN_DIAG_TIME | \ + RIN_DIAG_THREADNUM) + +int rin_diag_flags(int flag, int action); + void rin_err(const char *format, ...); void rin_fixme(const char *format, ...); void rin_warn(const char *format, ...); diff --git a/src/diagnostic/diagnostic.c b/src/diagnostic/diagnostic.c index 0648abe..9bb4396 100644 --- a/src/diagnostic/diagnostic.c +++ b/src/diagnostic/diagnostic.c @@ -18,14 +18,39 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include +#include +#include "rin/diagnostic.h" +#include "rin/definitions.h" #include "diagnostic_private.h" +static struct iostate { + FILE *err; + FILE *warn; + FILE *fixme; + FILE *info; + unsigned int flags; + char pidconv[8]; +} state = {NULL, NULL, NULL, NULL, RIN_DIAG_PREFIX, "%08x:"}; + +int rin_diag_flags(int flag, int action) +{ + /* checking for non-existent flags */ + if (flag & ~(RIN_DIAG_ALLFLAGS)) { + return EINVAL; + } + + state.flags = action ? (state.flags | flag) : (state.flags & ~(flag)); + + return 0; +} + void rin_err(const char *format, ...) { va_list args; va_start(args, format); - __rin_msg(stderr, "error", format, args); + __rin_msg(state.err ? state.err : stderr, "error", format, args); } void rin_warn(const char *format, ...) @@ -33,7 +58,7 @@ void rin_warn(const char *format, ...) va_list args; va_start(args, format); - __rin_msg(stderr, "warning", format, args); + __rin_msg(state.warn ? state.warn : stderr, "warning", format, args); } void rin_fixme(const char *format, ...) @@ -41,7 +66,7 @@ void rin_fixme(const char *format, ...) va_list args; va_start(args, format); - __rin_msg(stderr, "fixme", format, args); + __rin_msg(state.fixme ? state.fixme : stderr, "fixme", format, args); } void rin_info(const char *format, ...) @@ -49,11 +74,34 @@ void rin_info(const char *format, ...) va_list args; va_start(args, format); - __rin_msg(stdout, "info", format, args); + __rin_msg(state.info ? state.info : stdout, "info", format, args); } static void __rin_msg(FILE *stream, const char *prefix, const char *format, va_list args) { - fprintf(stream, "%s: ", prefix); + rin_once(__rin_pidconvadjust()); + + if (state.flags & RIN_DIAG_PREFIX) { + fprintf(stream, "%s:", prefix); + } + + if (state.flags & RIN_DIAG_THREADNUM) { + fprintf(stream, state.pidconv, gettid()); + } + + if (state.flags & RIN_DIAG_TIME) { + struct timespec t; + clock_gettime(CLOCK_REALTIME, &t); + fprintf(stream, "%lu.%lu:", t.tv_sec, t.tv_nsec); + } + vfprintf(stream, format, args); } + +static void __rin_pidconvadjust(void) +{ + if (sizeof(pid_t) == 4) { + const char convstr[8] = "%04hx:"; + memcpy(state.pidconv, convstr, sizeof(convstr)); + } +} diff --git a/src/diagnostic/diagnostic_private.h b/src/diagnostic/diagnostic_private.h index 284d2e7..45d414d 100644 --- a/src/diagnostic/diagnostic_private.h +++ b/src/diagnostic/diagnostic_private.h @@ -23,7 +23,21 @@ #include #include +#include +#include + +#ifdef __GLIBC__ +# if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 29) +# include +# else +# define _GNU_SOURCE +# include +# define gettid() (syscall(SYS_gettid)) +# endif +#endif + static void __rin_msg(FILE *stream, const char *prefix, const char *format, va_list args); +static void __rin_pidconvadjust(void); #endif /* LIBRIN_DIAGNOSTIC_PRIVATE_INCLUDED */ -- cgit v1.2.3