chiark / gitweb /
implement many logging arrangements - must still implement vlogmsg, the core; define...
authorian <ian>
Wed, 5 Jul 2006 17:43:19 +0000 (17:43 +0000)
committerian <ian>
Wed, 5 Jul 2006 17:43:19 +0000 (17:43 +0000)
hostside/realtime.c
hostside/safety.c
hostside/safety.h

index 4827ab358450d6b40e8f0f237f34789066cf8bb1..fa1e3d45acfe0d9dc2b5a92942d53f6d857dbeec 100644 (file)
@@ -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) {
index 487aefc39a859ae1185d6f548826582c927b5f36..21956f8a436e625d2bf2d20c1b7aab2e79a7535e 100644 (file)
@@ -8,6 +8,8 @@
 
 #include "realtime.h"
 
+State safety_state;
+
 static void seg_clear_stale(SegmentState *seg) {
   if (!seg->tr_updated) {
     seg->owned= 0;
index 26788d2aa6f841afc0b24376f35d67c98e933b32..deb577cee3105d22fc0ce54be29252211a614494 100644 (file)
@@ -3,13 +3,15 @@
 #ifndef SAFETY_H
 #define SAFETY_H
 
+#include <stdarg.h>
+
 #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 ==========*/
 /*