From 5e65915c6c4197b1b7a874ae8ace23127148cc92 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 13 Sep 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-09-13 --- port/devcons.c | 48 ++++++++++++++++++++++++++++++++++++++---------- port/proc.c | 5 ----- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/port/devcons.c b/port/devcons.c index 902b0a1fb155a914fdf5e377e86c64a5f7776502..d5d90561f85d6d3acc690df59c95421817b23c37 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -30,7 +30,7 @@ static struct char sysname[NAMELEN]; static ulong randomread(uchar*, ulong); -static void randomreset(void); +static void randominit(void); void printinit(void) @@ -410,12 +410,12 @@ readstr(ulong off, char *buf, ulong n, char *str) void consreset(void) { - randomreset(); } void consinit(void) { + randominit(); } Chan* @@ -891,7 +891,8 @@ setterm(char *f) static struct { QLock; - Rendez r; + Rendez producer; + Rendez consumer; uchar buf[4096]; uchar *ep; uchar *rp; @@ -903,11 +904,34 @@ static struct ulong randomcount; +static int +rbnotfull(void*) +{ + int i; + + i = rb.rp - rb.wp; + return i != 1 && i != (1 - sizeof(rb.buf)); +} + +void +genrandom(void*) +{ + up->basepri = PriNormal; + up->priority = up->basepri; + + for(;;){ + if(!rbnotfull(0)) + sleep(&rb.producer, rbnotfull, 0); + randomcount++; + } +} + void -randomreset(void) +randominit(void) { rb.ep = rb.buf + sizeof(rb.buf); rb.rp = rb.wp = rb.buf; + kproc("genrandom", genrandom, 0); } /* @@ -916,14 +940,16 @@ randomreset(void) void randomclock(void) { - int i; uchar *p; - i = rb.rp - rb.wp; - if(i == 1 || i == (1 - sizeof(rb.buf))) + if(randomcount == 0) + return; + + if(!rbnotfull(0)) return; rb.bits = (rb.bits<<2) ^ randomcount; + randomcount = 0; rb.next += 2; if(rb.next != 8) return; @@ -936,11 +962,11 @@ randomclock(void) rb.wp = p; if(rb.wakeme) - wakeup(&rb.r); + wakeup(&rb.consumer); } static int -notempty(void*) +rbnotempty(void*) { return rb.wp != rb.rp; } @@ -964,7 +990,7 @@ randomread(uchar *p, ulong n) i = rb.wp - rb.rp; if(i == 0){ rb.wakeme = 1; - sleep(&rb.r, notempty, 0); + sleep(&rb.consumer, rbnotempty, 0); rb.wakeme = 0; continue; } @@ -981,5 +1007,7 @@ randomread(uchar *p, ulong n) qunlock(&rb); poperror(); + wakeup(&rb.producer); + return n; } diff --git a/port/proc.c b/port/proc.c index e0c8d2f09745b8eb92381619be14c88225b32f8f..d387e1aaa1bda50e6f597d705a9d34226635afc9 100644 --- a/port/proc.c +++ b/port/proc.c @@ -47,8 +47,6 @@ char *statename[] = "Rendez", }; -ulong randomcount; - /* * Always splhi()'ed. */ @@ -186,9 +184,6 @@ loop: */ spllo(); for(;;){ - if(m->machno == 0) - randomcount++; - /* * Once a second we look for a long waiting process * in the lowest priority queue to make sure nothing