From df6b68092cf2806d7c517e15d2db57b0b19a9788 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 22 Nov 2013 22:28:20 +0100 Subject: [PATCH] kernel: kproc error and exit catch the error() that can be thrown by sleep() and tsleep() in kprocs. add missing pexit() calls. always set the freemem argument to pexit() from kproc otherwise the process gets added to the broken list. --- sys/src/9/port/alarm.c | 3 +++ sys/src/9/port/devaoe.c | 4 +++- sys/src/9/port/devsdp.c | 2 ++ sys/src/9/port/devsegment.c | 4 ++++ sys/src/9/port/random.c | 7 ++++--- sys/src/9/port/swap.c | 5 ++--- sys/src/9/port/usbehci.c | 2 ++ 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/sys/src/9/port/alarm.c b/sys/src/9/port/alarm.c index d500a68e4..b78088665 100644 --- a/sys/src/9/port/alarm.c +++ b/sys/src/9/port/alarm.c @@ -13,6 +13,9 @@ alarmkproc(void*) Proc *rp; ulong now; + while(waserror()) + ; + for(;;){ now = MACHP(0)->ticks; qlock(&alarms); diff --git a/sys/src/9/port/devaoe.c b/sys/src/9/port/devaoe.c index 0512f7016..a583ed4f3 100644 --- a/sys/src/9/port/devaoe.c +++ b/sys/src/9/port/devaoe.c @@ -701,8 +701,10 @@ loop: } runlock(&devs); i = Nms - TK2MS(Ticks - starttick); - if(i > 0) + if(i > 0 && !waserror()){ tsleep(&up->sleep, return0, 0, i); + poperror(); + } goto loop; } diff --git a/sys/src/9/port/devsdp.c b/sys/src/9/port/devsdp.c index a205be87a..2be928d66 100644 --- a/sys/src/9/port/devsdp.c +++ b/sys/src/9/port/devsdp.c @@ -908,6 +908,8 @@ sdpackproc(void *a) int i; Conv *c; + while(waserror()) + ; for(;;) { tsleep(&up->sleep, return0, 0, 1000); sec = TK2SEC(m->ticks); diff --git a/sys/src/9/port/devsegment.c b/sys/src/9/port/devsegment.c index 2606cb8ac..e9806e933 100644 --- a/sys/src/9/port/devsegment.c +++ b/sys/src/9/port/devsegment.c @@ -530,6 +530,8 @@ segmentkproc(void *arg) incref(g->s); up->seg[sno] = g->s; + while(waserror()) + ; for(done = 0; !done;){ sleep(&g->cmdwait, cmdready, g); if(waserror()){ @@ -554,6 +556,8 @@ segmentkproc(void *arg) g->cmd = Cnone; wakeup(&g->replywait); } + + pexit("done", 1); } Dev segmentdevtab = { diff --git a/sys/src/9/port/random.c b/sys/src/9/port/random.c index 3a697827a..f578d68cc 100644 --- a/sys/src/9/port/random.c +++ b/sys/src/9/port/random.c @@ -42,10 +42,11 @@ genrandom(void*) up->basepri = PriNormal; up->priority = up->basepri; + while(waserror()) + ; for(;;){ - for(;;) - if(++rb.randomcount > 100000) - break; + if(++rb.randomcount <= 100000) + continue; if(anyhigher()) sched(); if(!rbnotfull(0)) diff --git a/sys/src/9/port/swap.c b/sys/src/9/port/swap.c index 5c1d449bb..0340d566b 100644 --- a/sys/src/9/port/swap.c +++ b/sys/src/9/port/swap.c @@ -147,12 +147,11 @@ pager(void *junk) Segment *s; Proc *p, *ep; - if(waserror()) - panic("pager: os error"); - p = proctab(0); ep = &p[conf.nproc]; + while(waserror()) + ; loop: up->psstate = "Idle"; wakeup(&palloc.r); diff --git a/sys/src/9/port/usbehci.c b/sys/src/9/port/usbehci.c index 0cdffb750..66546675c 100644 --- a/sys/src/9/port/usbehci.c +++ b/sys/src/9/port/usbehci.c @@ -2225,6 +2225,8 @@ ehcipoll(void* a) hp = a; ctlr = hp->aux; poll = &ctlr->poll; + while(waserror()) + ; for(;;){ if(ctlr->nreqs == 0){ if(0)ddprint("ehcipoll %#p sleep\n", ctlr->capio);