diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-22 22:28:20 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-22 22:28:20 +0100 |
commit | df6b68092cf2806d7c517e15d2db57b0b19a9788 (patch) | |
tree | 932d57b6fac051acaedaa212403675d2b6670b83 | |
parent | 91c7e0b127ef494b151fae81d80885fd3d306dc5 (diff) |
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.
-rw-r--r-- | sys/src/9/port/alarm.c | 3 | ||||
-rw-r--r-- | sys/src/9/port/devaoe.c | 4 | ||||
-rw-r--r-- | sys/src/9/port/devsdp.c | 2 | ||||
-rw-r--r-- | sys/src/9/port/devsegment.c | 4 | ||||
-rw-r--r-- | sys/src/9/port/random.c | 7 | ||||
-rw-r--r-- | sys/src/9/port/swap.c | 5 | ||||
-rw-r--r-- | 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); |