M carrera/fns.h => carrera/fns.h +1 -0
@@ 142,3 142,4 @@ void* ifroute(ulong);
ulong ifunroute(ulong);
void parseip(char*, char*);
void mpegintr(void);
+#define coherence()
M pc/fns.h => pc/fns.h +1 -0
@@ 129,3 129,4 @@ ulong ifunroute(ulong);
void parseip(char*, char*);
#define dcflush(a, b)
+#define coherence()
M port/devmnt.c => port/devmnt.c +3 -13
@@ 768,19 768,9 @@ mntgate(Mnt *m)
lock(m);
m->rip = 0;
for(q = m->queue; q; q = q->list) {
- if(q->done == 0) {
- x = splhi(); /* because sleep also does */
- lock(&q->r);
- if(q->r.p) {
- unlock(&q->r);
- splx(x);
- unlock(m);
- wakeup(&q->r);
- return;
- }
- unlock(&q->r);
- splx(x);
- }
+ if(q->done == 0)
+ if(wakeup(&q->r))
+ break;
}
unlock(m);
}
M port/portdat.h => port/portdat.h +0 -1
@@ 50,7 50,6 @@ struct Ref
struct Rendez
{
- Lock;
Proc *p;
};
M port/portfns.h => port/portfns.h +1 -1
@@ 286,7 286,7 @@ long userwrite(char*, int);
void validaddr(ulong, ulong, int);
void vcacheinval(Page*, ulong);
void* vmemchr(void*, int, int);
-void wakeup(Rendez*);
+int wakeup(Rendez*);
Chan* walk(Chan*, char*, int);
void wlock(RWlock*);
void wunlock(RWlock*);
M port/proc.c => port/proc.c +11 -3
@@ 390,6 390,8 @@ sleep1(Rendez *r, int (*f)(void*), void *arg)
}
r->p = up;
+ coherence(); /* force memory state to reflect processor state */
+
/*
* if condition happened, never mind
*/
@@ 477,15 479,18 @@ tsleep(Rendez *r, int (*fn)(void*), void *arg, int ms)
/*
* Expects that only one process can call wakeup for any given Rendez
*/
-void
+int
wakeup(Rendez *r)
{
Proc *p;
- int s;
+ int s, rv;
+ coherence(); /* force memory state to reflect processor state */
+
+ rv = 0;
p = r->p;
if(p == 0)
- return;
+ return rv;
s = splhi();
lock(&p->rlock);
@@ 496,10 501,13 @@ wakeup(Rendez *r)
panic("wakeup: state");
p->r = 0;
ready(p);
+ rv = 1;
}
unlock(&p->rlock);
splx(s);
+
+ return rv;
}
int
M port/taslock.c => port/taslock.c +2 -0
@@ 96,6 96,7 @@ unlock(Lock *l)
{
l->key = 0;
l->pc = 0;
+ coherence();
}
void
@@ 107,4 108,5 @@ iunlock(Lock *l)
l->key = 0;
l->pc = 0;
splx(sr);
+ coherence();
}
M power/fns.h => power/fns.h +1 -0
@@ 84,3 84,4 @@ void wbflush(void);
Page* lkpage(Segment*, ulong);
void lkpgfree(Page*);
#define vcacheinval(s)
+#define coherence()