From 2dbff7551b815536e88352d0af6836ce32831c55 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 20 Feb 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-02-20 --- carrera/fns.h | 1 + pc/fns.h | 1 + port/devmnt.c | 16 +++------------- port/portdat.h | 1 - port/portfns.h | 2 +- port/proc.c | 14 +++++++++++--- port/taslock.c | 2 ++ power/fns.h | 1 + 8 files changed, 20 insertions(+), 18 deletions(-) diff --git a/carrera/fns.h b/carrera/fns.h index 556fbc2b7738ef5cb471e474e52d72d3a7c4d99e..361e3d233db4ab3e084c71d141d9d76d4088d247 100644 --- a/carrera/fns.h +++ b/carrera/fns.h @@ -142,3 +142,4 @@ void* ifroute(ulong); ulong ifunroute(ulong); void parseip(char*, char*); void mpegintr(void); +#define coherence() diff --git a/pc/fns.h b/pc/fns.h index 4816e6f483f420e027a747e713ed1dab608a6f5b..fff67dd96eca7426c946c436ab830b60bbdc827e 100644 --- a/pc/fns.h +++ b/pc/fns.h @@ -129,3 +129,4 @@ ulong ifunroute(ulong); void parseip(char*, char*); #define dcflush(a, b) +#define coherence() diff --git a/port/devmnt.c b/port/devmnt.c index 68892cee08f886f4e47670734da1b9ac596ce2c3..efc2e479d2b13d72ec1d0c0e0ecf577cbe3271c2 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -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); } diff --git a/port/portdat.h b/port/portdat.h index f6d3ce9c5b073c2acc16e2f4aa3de7f12f30c981..7c1eb0c3ddec98c593094234c310b801beb64925 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -50,7 +50,6 @@ struct Ref struct Rendez { - Lock; Proc *p; }; diff --git a/port/portfns.h b/port/portfns.h index 2e80d3e3bcb4c0f2da701ff096276910e0b5bd69..1f0cdea78da3de35deff6500e59e4120305a04e3 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -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*); diff --git a/port/proc.c b/port/proc.c index 6f90ce1645ff1fb12ff90e7bb7d52f830c392de3..3acc99cf703af1d69e8de303205435230ec776b4 100644 --- a/port/proc.c +++ b/port/proc.c @@ -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 diff --git a/port/taslock.c b/port/taslock.c index dc2b8b6836b171fdcbef2f4c77984450d3d47547..3277c2ffd9bc61afcab54ac36daedde205bd050b 100644 --- a/port/taslock.c +++ b/port/taslock.c @@ -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(); } diff --git a/power/fns.h b/power/fns.h index 62b1e65c4e4a67c63b9cc450f4409a16c06de3f9..d8ff6abdfe7a7cf4827e3e09702ed6c3a5892ce7 100644 --- a/power/fns.h +++ b/power/fns.h @@ -84,3 +84,4 @@ void wbflush(void); Page* lkpage(Segment*, ulong); void lkpgfree(Page*); #define vcacheinval(s) +#define coherence()