henesyinit from p9fce6d0435 years agoHistory
113 lines · 1.9 KB · C
RawDownload
#include "all.h"#include "mem.h"#include "io.h" long	niob;long	nhiob;Hiob	*hiob; struct{	Lock;	ulong	addr;} palloc; /* * Called to allocate permanent data structures * Alignment is in number of bytes. It pertains both to the start and * end of the allocated memory. */void*ialloc(ulong n, int align){	ulong p;	int m; 	lock(&palloc);	p = palloc.addr;	if(p == 0)		p = (ulong)end & ~KZERO;	if(align <= 0)		align = 4;	if(m = n % align)		n += align - m;	if(m = p % align)		p += align - m;	palloc.addr = p+n;	unlock(&palloc);	if(palloc.addr >= conf.mem)		panic("ialloc not enough mem");	memset((void*)(p|KZERO), 0, n);	return (void*)(p|KZERO);} /* * allocate rest of mem * for io buffers. */#define	HWIDTH	8	/* buffers per hash */voidiobufinit(void){	long i;	Iobuf *p, *q;	Hiob *hp; 	wlock(&mainlock);	/* init */	wunlock(&mainlock); 	i = conf.mem - ((ulong)ialloc(0, 0) & 0x0fffffffL);	i -= conf.sparemem;	niob = i / (sizeof(Iobuf) + RBUFSIZE + sizeof(Hiob)/HWIDTH);	nhiob = niob / HWIDTH;	while(!prime(nhiob))		nhiob++;	print("	%ld buffers; %ld hashes\n", niob, nhiob);	hiob = ialloc(nhiob * sizeof(Hiob), 0);	hp = hiob;	for(i=0; i<nhiob; i++) {		lock(hp);		unlock(hp);		hp++;	}	p = ialloc(niob * sizeof(Iobuf), 0);	hp = hiob;	for(i=0; i<niob; i++) {		p->name = "buf";		qlock(p);		qunlock(p);		if(hp == hiob)			hp = hiob + nhiob;		hp--;		q = hp->link;		if(q) {			p->fore = q;			p->back = q->back;			q->back = p;			p->back->fore = p;		} else {			hp->link = p;			p->fore = p;			p->back = p;		}		p->dev = devnone;		p->addr = -1;		p->xiobuf = ialloc(RBUFSIZE, RBUFSIZE);		p->iobuf = (char*)-1;		p++;	}	print("	mem left = %ld\n", conf.mem - ((ulong)ialloc(0, 1) & 0x0fffffffL));	print("		out of = %ld\n", conf.mem);} void*iobufmap(Iobuf *p){	return p->iobuf = p->xiobuf;} voidiobufunmap(Iobuf *p){	p->iobuf = (char*)-1;}