V8/usr/src/cmd/trace/malloc_t.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include "trace.h"

#define A_LARGE 64
#define A_USER 0x55000000

#define POOL	0
#define ALLOC	1
#define FREE	2
#define NREVENT	3

 union M {
	long size;
	union M *link;
 };

 union M *freelist[A_LARGE];
 long	 req[A_LARGE];

char *
talloc(u)
	long u;
{ union M *m;
  register r;
  char *Smalloc();

	u = ((u-1)/sizeof(union M) + 2);

	if( u >= A_LARGE )
	{	m = (union M *) malloc( u * sizeof(union M) );
		if (m == NULL)
			whoops("malloc fault");
	} else
	{	if( freelist[u] == NULL )
		{	r = req[u] += req[u] ? req[u] : 1;
			if (r > NOTOOBIG)
				r = req[u] = NOTOOBIG+1;
			freelist[u] = (union M *) Smalloc( r*u*sizeof(union M) );
			if (freelist[u] == NULL)
				whoops("malloc fault");

			(freelist[u] + u*(r-1))->link = 0;
			for (m = freelist[u] + u*(r-2); m >= freelist[u]; m -= u)
					m->link = m+u;
		}

		m = freelist[u];
		freelist[u] = m->link;
	}
	m->size = u | A_USER;

	return (char *) (m+1);
}

tfree(v)
	char *v;
{ register union M *m = (union M *) v;
  register long u;

	--m;
	if ( (m->size&0xFF000000) != A_USER)
	{	fprintf(stderr, "releasing a free block\n");
		kill(getpid(), 3);
	}

	u = (m->size &= 0xFFFFFF);
	if ( u >= A_LARGE )
		free(m);
	else
	{	m->link = freelist[u];
		freelist[u] = m;
	}
}