summaryrefslogtreecommitdiff
path: root/sys/src/9/mtx
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-05-03 08:49:25 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-05-03 08:49:25 +0200
commit7f04d86dfbb43cdbd18b2e3be31421dc9efee3b7 (patch)
tree8c8fc0888439b6e20cd856c6e1d9ae27001b14d3 /sys/src/9/mtx
parent5377a194478225481976f8400d10c093e5bdfa01 (diff)
kernel: move duplicated random.c to port
Diffstat (limited to 'sys/src/9/mtx')
-rw-r--r--sys/src/9/mtx/mkfile2
-rw-r--r--sys/src/9/mtx/random.c138
2 files changed, 1 insertions, 139 deletions
diff --git a/sys/src/9/mtx/mkfile b/sys/src/9/mtx/mkfile
index be2e8917d..f1efadf6a 100644
--- a/sys/src/9/mtx/mkfile
+++ b/sys/src/9/mtx/mkfile
@@ -36,6 +36,7 @@ PORT=\
taslock.$O\
tod.$O\
xalloc.$O\
+ random.$O\
OBJ=\
l.$O\
@@ -44,7 +45,6 @@ OBJ=\
i8259.$O\
main.$O\
mmu.$O\
- random.$O\
raven.$O\
trap.$O\
$CONF.root.$O\
diff --git a/sys/src/9/mtx/random.c b/sys/src/9/mtx/random.c
deleted file mode 100644
index 3c204b8d1..000000000
--- a/sys/src/9/mtx/random.c
+++ /dev/null
@@ -1,138 +0,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "../port/error.h"
-
-
-struct Rb
-{
- QLock;
- Rendez producer;
- Rendez consumer;
- ulong randomcount;
- uchar buf[1024];
- uchar *ep;
- uchar *rp;
- uchar *wp;
- uchar next;
- uchar wakeme;
- ushort bits;
- ulong randn;
-} rb;
-
-static int
-rbnotfull(void*)
-{
- int i;
-
- i = rb.rp - rb.wp;
- return i != 1 && i != (1 - sizeof(rb.buf));
-}
-
-static int
-rbnotempty(void*)
-{
- return rb.wp != rb.rp;
-}
-
-static void
-genrandom(void*)
-{
- up->basepri = PriNormal;
- up->priority = up->basepri;
-
- for(;;){
- for(;;)
- if(++rb.randomcount > 100000)
- break;
- if(anyhigher())
- sched();
- if(!rbnotfull(0))
- sleep(&rb.producer, rbnotfull, 0);
- }
-}
-
-/*
- * produce random bits in a circular buffer
- */
-static void
-randomclock(void)
-{
- if(rb.randomcount == 0 || !rbnotfull(0))
- return;
-
- rb.bits = (rb.bits<<2) ^ rb.randomcount;
- rb.randomcount = 0;
-
- rb.next++;
- if(rb.next != 8/2)
- return;
- rb.next = 0;
-
- *rb.wp ^= rb.bits;
- if(rb.wp+1 == rb.ep)
- rb.wp = rb.buf;
- else
- rb.wp = rb.wp+1;
-
- if(rb.wakeme)
- wakeup(&rb.consumer);
-}
-
-void
-randominit(void)
-{
- addclock0link(randomclock, 1000/HZ);
- rb.ep = rb.buf + sizeof(rb.buf);
- rb.rp = rb.wp = rb.buf;
- kproc("genrandom", genrandom, 0);
-}
-
-/*
- * consume random bytes from a circular buffer
- */
-ulong
-randomread(void *xp, ulong n)
-{
- uchar *e, *p;
- ulong x;
-
- p = xp;
-
- if(waserror()){
- qunlock(&rb);
- nexterror();
- }
-
- qlock(&rb);
- for(e = p + n; p < e; ){
- if(rb.wp == rb.rp){
- rb.wakeme = 1;
- wakeup(&rb.producer);
- sleep(&rb.consumer, rbnotempty, 0);
- rb.wakeme = 0;
- continue;
- }
-
- /*
- * beating clocks will be precictable if
- * they are synchronized. Use a cheap pseudo
- * random number generator to obscure any cycles.
- */
- x = rb.randn*1103515245 ^ *rb.rp;
- *p++ = rb.randn = x;
-
- if(rb.rp+1 == rb.ep)
- rb.rp = rb.buf;
- else
- rb.rp = rb.rp+1;
- }
- qunlock(&rb);
- poperror();
-
- wakeup(&rb.producer);
-
- return n;
-}