From a6f869077e1fed2241829f3a8d53637f5a25c3a2 Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 5 Jul 2006 17:43:19 +0000 Subject: [PATCH] implement many logging arrangements - must still implement vlogmsg, the core; define safety_state (but still no code to initialise it) --- hostside/realtime.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ hostside/safety.c | 2 ++ hostside/safety.h | 15 ++++++++---- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/hostside/realtime.c b/hostside/realtime.c index 4827ab3..fa1e3d4 100644 --- a/hostside/realtime.c +++ b/hostside/realtime.c @@ -38,6 +38,63 @@ static void *read_exception(oop_source *evts, int fd, return OOP_CONTINUE; } +/*---------- logging etc. ----------*/ + +void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn,const char *fmt,...) { + va_list al; + va_start(al,fmt); + vlogmsg(ec,tran,segn,fmt,al); + va_end(al); +} + +static char *transegn2suffixstring(TrainNum tran, SegmentNum segn) { + /* Either arg may be NOTA(...), in which case it's not included. + * Result string will be empty, or start with ": " + * Result string is from malloc. + * Never fails. + */ + const char *tra, *seg; + char *s; + int r; + + seg= ~segn ? info_segments[segn].pname : 0; + tra= ~tran ? info_trains[tran].pname : 0; + + r= asprintf(&s, "%s%s%s%s%s", + seg||tra ? ":" : "", + seg ? " @" : "", + seg ? seg : "", + tra ? " " : "", + tra ? tra : ""); + if (r<0) diee("vasprintf failed in transegn2suffixstring " + "tran=%lu segn=%lu", (unsigned long)tran, (unsigned long)segn); + return s; +} + +void safety_vpanic(TrainNum tran, SegmentNum segn,const char *fmt,va_list al) { + char *msg, *where; + + if (vasprintf(&msg,fmt,al) < 0) + diee("vasprintf failed in safety_vpanic fmt=\"%s\"", fmt); + + where= transegn2suffixstring(tran,segn); + die("fatal safety problem: %s%s", msg, where); +} + +void safety_panic(TrainNum tran, SegmentNum segn, const char *fmt, ...) { + va_list al; + va_start(al,fmt); + safety_panic(tran, segn, fmt, al); +} + +ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt,...) { + va_list al; + va_start(al,fmt); + vlogmsg(EC_Safety, tran, segn, fmt, al); + va_end(al); + return EC_Safety; +} + /*---------- command channel handling (oop_read, obc) ----------*/ static void command_doline(ParseState *ps, CommandInput *cmdi) { diff --git a/hostside/safety.c b/hostside/safety.c index 487aefc..21956f8 100644 --- a/hostside/safety.c +++ b/hostside/safety.c @@ -8,6 +8,8 @@ #include "realtime.h" +State safety_state; + static void seg_clear_stale(SegmentState *seg) { if (!seg->tr_updated) { seg->owned= 0; diff --git a/hostside/safety.h b/hostside/safety.h index 26788d2..deb577c 100644 --- a/hostside/safety.h +++ b/hostside/safety.h @@ -3,13 +3,15 @@ #ifndef SAFETY_H #define SAFETY_H +#include + #include "../layout/layout-data.h" #include "layoutinfo.h" +#include "errorcodes.h" /*========== more basic types etc. ==========*/ typedef short TimeInterval; /*ms*/ -typedef int ErrorCode; /*---------- units and scales ----------*/ @@ -59,14 +61,19 @@ extern State safety_state; * handling, arg parsing, etc. */ -void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn, const char *fmt,...) - __attribute__((format(printf,4,5))); +void vlogmsg(ErrorCode ec, TrainNum tran, SegmentNum segn, + const char *fmt, va_list al) __attribute__((format(printf,4,0))); +void logmsg(ErrorCode ec, TrainNum tran, SegmentNum segn, + const char *fmt, ...) __attribute__((format(printf,4,5))); +void safety_vpanic(TrainNum tran, SegmentNum segn, const char *fmt, va_list al) + __attribute__((format(printf,3,0),noreturn)); void safety_panic(TrainNum tran, SegmentNum segn, const char *fmt,...) __attribute__((format(printf,3,4),noreturn)); -ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt,...) +ErrorCode safety_problem(TrainNum tran, SegmentNum segn, const char *fmt, ...) __attribute__((format(printf,3,4))); + /* simple wrapper around vlogmsg; implies and returns EC_Safety */ /*========== safety.c ==========*/ /* -- 2.30.2