⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profile.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
#include	<u.h>#include	<libc.h>extern	long*	_clock;extern	long	_callpc(void**);extern	long	_savearg(void);typedef	struct	Plink	Plink;struct	Plink{	Plink	*old;		/* known to be 0(ptr) */	Plink	*down;	Plink	*link;	long	pc;	long	count;	long	time;		/* known to be 20(ptr) */};struct{	Plink	*pp;		/* known to be 0(ptr) */	Plink	*next;		/* known to be 4(ptr) */	Plink	*last;	Plink	*first;} __prof;ulong_profin(void){	void *dummy;	long pc;	Plink *pp, *p;	ulong arg;	arg = _savearg();	pc = _callpc(&dummy);	pp = __prof.pp;	if(pp == 0)		return arg;	for(p=pp->down; p; p=p->link)		if(p->pc == pc)			goto out;	p = __prof.next + 1;	if(p >= __prof.last) {		__prof.pp = 0;		return arg;	}	__prof.next = p;	p->link = pp->down;	pp->down = p;	p->pc = pc;	p->old = pp;	p->down = 0;	p->count = 0;out:	__prof.pp = p;	p->count++;	p->time += *_clock;	return arg;		/* disgusting linkage */}ulong_profout(void){	Plink *p;	ulong arg;	arg = _savearg();	p = __prof.pp;	if(p) {		p->time -= *_clock;		__prof.pp = p->old;	}	return arg;}void_profdump(void){	int f;	long n;	Plink *p;	char *vp;	__prof.pp = 0;	f = create("prof.out", 1, 0666);	if(f < 0) {		perror("create prof.out");		return;	}	__prof.first->time = -*_clock;	vp = (char*)__prof.first;	for(p = __prof.first; p <= __prof.next; p++) {		/*		 * short down		 */		n = 0xffff;		if(p->down)			n = p->down - __prof.first;		vp[0] = n>>8;		vp[1] = n;		/*		 * short right		 */		n = 0xffff;		if(p->link)			n = p->link - __prof.first;		vp[2] = n>>8;		vp[3] = n;		vp += 4;		/*		 * long pc		 */		n = p->pc;		vp[0] = n>>24;		vp[1] = n>>16;		vp[2] = n>>8;		vp[3] = n;		vp += 4;		/*		 * long count		 */		n = p->count;		vp[0] = n>>24;		vp[1] = n>>16;		vp[2] = n>>8;		vp[3] = n;		vp += 4;		/*		 * long time		 */		n = -p->time;		vp[0] = n>>24;		vp[1] = n>>16;		vp[2] = n>>8;		vp[3] = n;		vp += 4;	}	write(f, (char*)__prof.first, vp - (char*)__prof.first);	close(f);}void_profmain(void){	char ename[50];	int n, f;	n = 2000;	f = open("/env/profsize", OREAD);	if(f >= 0) {		memset(ename, 0, sizeof(ename));		read(f, ename, sizeof(ename)-1);		close(f);		n = atol(ename);	}	__prof.first = sbrk(n*sizeof(Plink));	__prof.last = sbrk(0);	__prof.next = __prof.first;	atexit(_profdump);	*_clock = 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -