AUSAM/source/libc/alloc.c

#
/*
 *	C storage allocator
 *	(circular first fit strategy)
 */ 
#define BLOK 512
#define BUSY 01

char *allocs[2] /*initial empty arena*/
{
	&allocs[1],
	&allocs[0]
};
struct
{
	int word;
};
char **allocp &allocs[1];	/*current search pointer*/ 
char **alloct &allocs[1];	/*top of arena (last cell)*/ 

alloc(nbytes)
{
	register int nwords;
	register char **p, **q;
	static char **t;
	static int temp;



	allocs[0].word =| BUSY;	/*static initialization*/ 
	allocs[1].word =| BUSY;

	nwords = (nbytes+(2*sizeof(p)-1))/sizeof(p);
	for(p = allocp; ; )
	{
		do
		{
			if((p->word&BUSY) == 0)
			{
				while(((q = *p)->word&BUSY) == 0)
					*p = *q;
				if(q >= &p[nwords])
					goto found;
			}
			q = p;
			p = p->word&~BUSY;
		}
		while(q >= allocp || p < allocp);
		if((temp = t = sbrk(BLOK*sizeof(p))) == -1)
			return(-1);
		else
			*alloct = t;
		if(t != alloct+1)
			alloct->word =| BUSY;
		alloct = (*t = &t[BLOK]-1);
		*alloct = allocs;
		alloct->word =| BUSY;
	}
found:
	allocp = &p[nwords];
	if(q > allocp)
		*allocp = *p;
	*p = allocp.word|BUSY;
	return(p+1);
}

free(p)
char **p;
{
	register char **r, **s;


	r = allocs;
	do
	{
		s = r->word&~BUSY;
	}
	while(s != p-1 && (r = s) != allocs);
	if(r == allocs)
	{
		abort("free error");
	}
	allocp = p-1;
	allocp->word =& ~BUSY;
}