63 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id$ */
 | 
						|
static int bs;
 | 
						|
static char *bp;
 | 
						|
static char *bufp;
 | 
						|
static int sc;
 | 
						|
static int bufs;
 | 
						|
 | 
						|
monitor(lowpc, highpc, buffer, bufsize, nfunc)
 | 
						|
	int (*lowpc)(), (*highpc)();
 | 
						|
	char *buffer;
 | 
						|
{
 | 
						|
	long scale;
 | 
						|
 | 
						|
	if (lowpc == 0) {
 | 
						|
		int fd;
 | 
						|
 | 
						|
		profil((char *) 0, 0, 0, 0);
 | 
						|
		if ((fd = creat("mon.out", 0666)) < 0 || !bp) return;
 | 
						|
		write(fd, bp, (int) bs);
 | 
						|
		close(fd);
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	bs = bufsize << 1;
 | 
						|
	bp = buffer;
 | 
						|
 | 
						|
	*(char **) buffer = (char *) lowpc;
 | 
						|
	buffer += sizeof(char *);
 | 
						|
	*(char **) buffer = (char *) highpc;
 | 
						|
	buffer += sizeof(char *);
 | 
						|
	*(int *) buffer = nfunc;
 | 
						|
	buffer += sizeof(int);
 | 
						|
	buffer += (sizeof (char *) + sizeof(long)) * nfunc;
 | 
						|
	bufsize -= ((sizeof (char *) + sizeof(long)) * nfunc + 2 * sizeof(char *) + sizeof(int)) >> 1;
 | 
						|
	if (bufsize < 0) return;
 | 
						|
	scale = ((char *) highpc - (char *) lowpc) >> 1;
 | 
						|
	if (bufsize < scale)
 | 
						|
		scale = ((long) bufsize << 15) / scale;
 | 
						|
	else	scale = 0x8000;
 | 
						|
	bufp = buffer;
 | 
						|
	sc = scale << 1;
 | 
						|
	bufs = bufsize << 1;
 | 
						|
	profil(buffer, bufs, lowpc, sc);
 | 
						|
}
 | 
						|
 | 
						|
moncontrol(mode)
 | 
						|
{
 | 
						|
	profil(bufp, bufs, *(char **) bp, !mode ? 0 : sc);
 | 
						|
}
 | 
						|
 | 
						|
#define NCOUNTS 300
 | 
						|
 | 
						|
monstartup(lowpc, highpc)
 | 
						|
	int (*lowpc)(), (*highpc)();
 | 
						|
{
 | 
						|
	int sz = (((char *) highpc - (char *) lowpc + 7) & ~7);
 | 
						|
	char *s, *sbrk();
 | 
						|
 | 
						|
	sz += NCOUNTS * (sizeof(long) + sizeof(char *)) + 2 * sizeof(char *) + sizeof(int);
 | 
						|
	s = sbrk(sz);
 | 
						|
	if ((int) s == -1) return;
 | 
						|
	monitor(lowpc, highpc, s, sz >> 1, NCOUNTS);
 | 
						|
}
 |