summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-04-29 21:17:07 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-04-29 21:17:07 +0200
commita2d96d47c996d3e31d5a93771c2cf91f994a5473 (patch)
tree59d9a30b6a6ffc00b801d1d93d28c0db9a79723c /sys/src
parentb7d8431036d1fbc8d366ef9ddff5e6ab93e4bc94 (diff)
kernel: always reset notepending in eqlock, handle forceclosefgrp in eqlocks
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/port/pgrp.c2
-rw-r--r--sys/src/9/port/portfns.h1
-rw-r--r--sys/src/9/port/proc.c12
-rw-r--r--sys/src/9/port/qlock.c5
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;
}