diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-04-29 21:17:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-04-29 21:17:07 +0200 |
commit | a2d96d47c996d3e31d5a93771c2cf91f994a5473 (patch) | |
tree | 59d9a30b6a6ffc00b801d1d93d28c0db9a79723c /sys/src | |
parent | b7d8431036d1fbc8d366ef9ddff5e6ab93e4bc94 (diff) |
kernel: always reset notepending in eqlock, handle forceclosefgrp in eqlocks
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/port/pgrp.c | 2 | ||||
-rw-r--r-- | sys/src/9/port/portfns.h | 1 | ||||
-rw-r--r-- | sys/src/9/port/proc.c | 12 | ||||
-rw-r--r-- | sys/src/9/port/qlock.c | 5 |
4 files changed, 14 insertions, 6 deletions
diff --git a/sys/src/9/port/pgrp.c b/sys/src/9/port/pgrp.c index 069df11da..8fb3e1fa0 100644 --- a/sys/src/9/port/pgrp.c +++ b/sys/src/9/port/pgrp.c @@ -225,7 +225,7 @@ closefgrp(Fgrp *f) } /* - * Called from sleep because up is in the middle + * Called from interrupted() because up is in the middle * of closefgrp and just got a kill ctl message. * This usually means that up has wedged because * of some kind of deadly embrace with mntclose diff --git a/sys/src/9/port/portfns.h b/sys/src/9/port/portfns.h index 233dcaf9a..7ee6a4d02 100644 --- a/sys/src/9/port/portfns.h +++ b/sys/src/9/port/portfns.h @@ -130,6 +130,7 @@ Block* iallocb(int); void iallocsummary(void); long ibrk(uintptr, int); void ilock(Lock*); +void interrupted(void); void iunlock(Lock*); long incref(Ref*); void initseg(void); diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index fdac770fa..0d96ed5c3 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -802,14 +802,20 @@ sleep(Rendez *r, int (*f)(void*), void *arg) if(up->notepending) { up->notepending = 0; splx(s); - if(up->procctl == Proc_exitme && up->closingfgrp) - forceclosefgrp(); - error(Eintr); + interrupted(); } splx(s); } +void +interrupted(void) +{ + if(up->procctl == Proc_exitme && up->closingfgrp != nil) + forceclosefgrp(); + error(Eintr); +} + static int tfn(void *arg) { diff --git a/sys/src/9/port/qlock.c b/sys/src/9/port/qlock.c index df6848b97..57982b217 100644 --- a/sys/src/9/port/qlock.c +++ b/sys/src/9/port/qlock.c @@ -39,8 +39,9 @@ eqlock(QLock *q) if(up == 0) panic("eqlock"); if(up->notepending){ + up->notepending = 0; unlock(&q->use); - error(Eintr); + interrupted(); } rwstats.qlockq++; p = q->tail; @@ -57,7 +58,7 @@ eqlock(QLock *q) sched(); if(up->eql == 0){ up->notepending = 0; - error(Eintr); + interrupted(); } up->eql = 0; } |