plan 9 kernel history: overview | file list | diff list

1995/0910/port/devcons.c (diff list | history)

1995/0815/sys/src/9/port/devcons.c:27,351995/0910/sys/src/9/port/devcons.c:27,37 (short | long | prev | next)
1995/0112    
	int	ctlpoff; 
1993/0601    
} kbd; 
 
                 
1992/0321    
char	sysname[NAMELEN]; 
1991/1109    
 
1995/0910    
static ulong randomread(uchar*, ulong); 
static void randomreset(void); 
 
1990/0227    
void 
1991/0607    
printinit(void) 
1990/0227    
{ 
1995/0815/sys/src/9/port/devcons.c:330,3351995/0910/sys/src/9/port/devcons.c:332,338
1990/0227    
	Qpgrpid, 
	Qpid, 
	Qppid, 
1995/0910    
	Qrandom, 
1991/0705    
	Qswap, 
1992/0321    
	Qsysname, 
1992/0428    
	Qsysstat, 
1995/0815/sys/src/9/port/devcons.c:356,3611995/0910/sys/src/9/port/devcons.c:359,365
1991/1127    
	"pgrpid",	{Qpgrpid},	NUMSIZE,	0444, 
	"pid",		{Qpid},		NUMSIZE,	0444, 
	"ppid",		{Qppid},	NUMSIZE,	0444, 
1995/0910    
	"random",	{Qrandom},	0,		0664, 
1991/1211    
	"swap",		{Qswap},	0,		0664, 
1992/0428    
	"sysname",	{Qsysname},	0,		0664, 
	"sysstat",	{Qsysstat},	0,		0666, 
1995/0815/sys/src/9/port/devcons.c:406,4111995/0910/sys/src/9/port/devcons.c:410,416
1990/0227    
void 
consreset(void) 
{ 
1995/0910    
	randomreset(); 
1990/0227    
} 
 
void 
1995/0815/sys/src/9/port/devcons.c:642,6471995/0910/sys/src/9/port/devcons.c:647,655
1992/0321    
	case Qsysname: 
		return readstr(offset, buf, n, sysname); 
 
1995/0910    
	case Qrandom: 
		return randomread(buf, n); 
 
1990/0227    
	default: 
1991/1127    
		print("consread %lux\n", c->qid); 
		error(Egreg); 
1995/0815/sys/src/9/port/devcons.c:878,8811995/0910/sys/src/9/port/devcons.c:886,985
1991/1102    
 
	sprint(buf, f, conffile); 
	ksetenv("terminal", buf); 
1995/0910    
} 
 
static struct 
{ 
	QLock; 
	Rendez	r; 
	uchar	buf[4096]; 
	uchar	*ep; 
	uchar	*rp; 
	uchar	*wp; 
	uchar	next; 
	uchar	bits; 
	uchar	wakeme; 
} rb; 
 
ulong randomcount; 
 
void 
randomreset(void) 
{ 
	rb.ep = rb.buf + sizeof(rb.buf); 
	rb.rp = rb.wp = rb.buf; 
} 
 
/* 
 *  produce random bits in a circular buffer 
 */ 
void 
randomclock(void) 
{ 
	int i; 
	uchar *p; 
 
	i = rb.rp - rb.wp; 
	if(i == 1 || i == (1 - sizeof(rb.buf))) 
		return; 
 
	rb.bits = (rb.bits<<2) ^ randomcount; 
	rb.next += 2; 
	if(rb.next != 8) 
		return; 
 
	rb.next = 0; 
	*rb.wp ^= rb.bits; 
	p = rb.wp+1; 
	if(p == rb.ep) 
		p = rb.buf; 
	rb.wp = p; 
 
	if(rb.wakeme) 
		wakeup(&rb.r); 
} 
 
static int 
notempty(void*) 
{ 
	return rb.wp != rb.rp; 
} 
 
/* 
 *  consume random bytes from a circular buffer 
 */ 
static ulong 
randomread(uchar *p, ulong n) 
{ 
	int i, sofar; 
	uchar *e; 
 
	if(waserror()){ 
		qunlock(&rb); 
		nexterror(); 
	} 
 
	qlock(&rb); 
	for(sofar = 0; sofar < n; sofar += i){ 
		i = rb.wp - rb.rp; 
		if(i == 0){ 
			rb.wakeme = 1; 
			sleep(&rb.r, notempty, 0); 
			rb.wakeme = 0; 
			continue; 
		} 
		if(i < 0) 
			i = rb.ep - rb.rp; 
		if(i > n) 
			i = n; 
		memmove(p + sofar, rb.rp, i); 
		e = rb.rp + i; 
		if(e == rb.ep) 
			e = rb.buf; 
		rb.rp = e; 
	} 
	qunlock(&rb); 
	poperror(); 
 
	return n; 
1991/1102    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)