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 --- src/diagnostic/diagnostic.c | 58 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 5 deletions(-) (limited to 'src/diagnostic/diagnostic.c') 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)); + } +} -- cgit v1.2.3