diff options
author | 2019-10-01 15:18:09 +0300 | |
---|---|---|
committer | 2019-10-01 15:18:09 +0300 | |
commit | 41190343562493449a1801fa5a7eecf181b8656e (patch) | |
tree | 4ea207f75fcf62ce39efae376a5aa08256cd0794 /src/diagnostic | |
parent | adff2b3f348268096a5416bc5be3d52a931ebf7d (diff) | |
download | librin-41190343562493449a1801fa5a7eecf181b8656e.tar.gz librin-41190343562493449a1801fa5a7eecf181b8656e.tar.bz2 librin-41190343562493449a1801fa5a7eecf181b8656e.zip |
diagnostics: add more prefixes.
This also starts preparations for overhaul of this subsystem.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/diagnostic')
-rw-r--r-- | src/diagnostic/diagnostic.c | 58 | ||||
-rw-r--r-- | src/diagnostic/diagnostic_private.h | 14 |
2 files changed, 67 insertions, 5 deletions
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 <string.h> +#include <time.h> +#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 <stdio.h> #include <stdarg.h> +#include <errno.h> +#include <unistd.h> + +#ifdef __GLIBC__ +# if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 29) +# include <sys/types.h> +# else +# define _GNU_SOURCE +# include <sys/syscall.h> +# 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 */ |