From d5036362f34ab74c50b45d380c5323e3bb4e5b93 Mon Sep 17 00:00:00 2001 From: ian Date: Tue, 9 May 2006 22:39:22 +0000 Subject: [PATCH] flush obc on death --- hostside/common.h | 2 ++ hostside/daemons.h | 2 ++ hostside/gui-plan.c | 2 ++ hostside/main.c | 2 ++ hostside/obc.c | 23 ++++++++++++++--------- hostside/realtime.c | 8 +++++++- hostside/utils.c | 1 + 7 files changed, 30 insertions(+), 10 deletions(-) diff --git a/hostside/common.h b/hostside/common.h index 7354b09..008d219 100644 --- a/hostside/common.h +++ b/hostside/common.h @@ -92,6 +92,8 @@ void die(const char *fmt, ...) __attribute__((noreturn,format(printf,1,2))); void diee(const char *fmt, ...) __attribute__((noreturn,format(printf,1,2))); void diem(void) __attribute__((noreturn)); +void die_hook(void); + void *mmalloc(size_t sz); char *mstrdupl(const char *s, int l); char *mstrdup(const char *s); diff --git a/hostside/daemons.h b/hostside/daemons.h index dbe8c1c..0db7963 100644 --- a/hostside/daemons.h +++ b/hostside/daemons.h @@ -33,6 +33,8 @@ struct OutBufferChain { }; void obc_init(OutBufferChain *ch); +int obc_tryflush(OutBufferChain *ch); + /* returns 0 for all flushed or errno, including particularly EWOULDBLOCK */ void ovprintf(OutBufferChain *ch, const char *fmt, va_list al) __attribute__((format(printf,2,0))); diff --git a/hostside/gui-plan.c b/hostside/gui-plan.c index 3f40f89..961ef19 100644 --- a/hostside/gui-plan.c +++ b/hostside/gui-plan.c @@ -57,6 +57,8 @@ static unsigned long train_pixel, owned_pixel; static const char *badcmdreport_data; static size_t badcmdreport_recsz; +void die_hook(void) { } + static void diex(const char *fn, const char *w) __attribute__((noreturn)); static void diex(const char *fn, const char *w) { die("Xlib call failed: %s%s%s%s", fn, diff --git a/hostside/main.c b/hostside/main.c index 378c173..f14a5df 100644 --- a/hostside/main.c +++ b/hostside/main.c @@ -27,6 +27,8 @@ static const char *serial_port; static Nmra buf; +void die_hook(void) { } + static void badusage(const char *why) { fprintf(stderr,"bad usage: %s\n",why); exit(8); } diff --git a/hostside/obc.c b/hostside/obc.c index 7154d83..040ee6a 100644 --- a/hostside/obc.c +++ b/hostside/obc.c @@ -18,20 +18,15 @@ struct OutBuffer { int l; }; -static void *writeable(oop_source *evts, int fd, - oop_event evt, void *ch_v) { - OutBufferChain *ch= ch_v; +int obc_tryflush(OutBufferChain *ch) { OutBuffer *ob; int r; - assert(fd == ch->fd); - assert(evt == OOP_WRITE); - for (;;) { ob= ch->obs.head; if (!ob) { - events->cancel_fd(events, fd, OOP_WRITE); - return OOP_CONTINUE; + events->cancel_fd(events, ch->fd, OOP_WRITE); + return 0; } if (ch->done_of_head == ob->l) { LIST_UNLINK(ch->obs, ob); @@ -43,8 +38,9 @@ static void *writeable(oop_source *evts, int fd, r= write(ch->fd, ob->m + ch->done_of_head, ob->l - ch->done_of_head); if (r==-1) { if (errno==EINTR) continue; - if (errno==EWOULDBLOCK) return OOP_CONTINUE; + if (errno==EWOULDBLOCK) return errno; ch->error(ch,"write",strerror(errno)); + return errno; } assert(r>=0); ch->done_of_head += r; @@ -52,6 +48,15 @@ static void *writeable(oop_source *evts, int fd, } } +static void *writeable(oop_source *evts, int fd, + oop_event evt, void *ch_v) { + OutBufferChain *ch= ch_v; + assert(fd == ch->fd); + assert(evt == OOP_WRITE); + obc_tryflush(ch); + return OOP_CONTINUE; +} + static void addlink(OutBufferChain *ch, OutBuffer *ob) { if (!ch->obs.head) events->on_fd(events, ch->fd, OOP_WRITE, writeable, ch); diff --git a/hostside/realtime.c b/hostside/realtime.c index 0c65026..e636ed1 100644 --- a/hostside/realtime.c +++ b/hostside/realtime.c @@ -70,6 +70,12 @@ void ouhex(const char *word, const Byte *command, int length) { oprintf(UPO, "\n"); } +void die_hook() { + int e; + e= obc_tryflush(UPO); + if (e) fprintf(stderr,"(unwritten command output: %s)\n",strerror(e)); +} + /*---------- serial input (via oop) ----------*/ static PicInsn serial_buf; @@ -130,7 +136,7 @@ int main(int argc, const char **argv) { int r; device= argv[1]; - if (!device) device= "/dev/ttyS0"; + if (!device) device= "/dev/ttya0"; sys_events= oop_sys_new(); if (!sys_events) diee("oop_sys_new"); events= oop_sys_source(sys_events); massert(events); diff --git a/hostside/utils.c b/hostside/utils.c index 3a1cb42..8b128cd 100644 --- a/hostside/utils.c +++ b/hostside/utils.c @@ -12,6 +12,7 @@ #include "common.h" void vdie(const char *fmt, int ev, va_list al) { + die_hook(); fprintf(stderr, "%s: fatal: ", progname); vfprintf(stderr,fmt,al); if (ev) fprintf(stderr,": %s",strerror(ev)); -- 2.30.2