aboutsummaryrefslogtreecommitdiffstats
path: root/src/diagnostic
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2019-10-01 15:18:09 +0300
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2019-10-01 15:18:09 +0300
commit41190343562493449a1801fa5a7eecf181b8656e (patch)
tree4ea207f75fcf62ce39efae376a5aa08256cd0794 /src/diagnostic
parentadff2b3f348268096a5416bc5be3d52a931ebf7d (diff)
downloadlibrin-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.c58
-rw-r--r--src/diagnostic/diagnostic_private.h14
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 */