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

📄 malloc.c

📁 早期freebsd实现
💻 C
字号:
/* $Header: malloc.c,v 2.2 88/09/19 12:55:18 nhall Exp $ *//* $Source: /var/home/tadl/src/argo/xebec/RCS/malloc.c,v $ *//* * This code is such a kludge that I don't want to put my name on it. * It was a ridiculously fast hack and needs rewriting. * However it does work... *//*  * a simple malloc * it might be brain-damaged but for the purposes of xebec * it's a whole lot faster than the c library malloc  */#include <stdio.h>#include "malloc.h"#include "debug.h"#define CHUNKSIZE 4096*2static char *hiwat, *highend;int bytesmalloced=0;int byteswasted = 0;init_alloc(){#ifdef LINT	hiwat = 0;	highend = 0;#else LINT	extern char *sbrk();	hiwat = (char *) sbrk(0);	hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);	highend = hiwat;#endif LINT}HIWAT(s)char *s;{	IFDEBUG(M)		fprintf(stdout, "HIWAT 0x%x  %s\n", hiwat,s);		fflush(stdout);	ENDDEBUG}#define MIN(x,y) ((x<y)?x:y)char *Malloc(x)int x;{	char *c;	extern char *sbrk();	static int firsttime=1;	int total = x;	int first_iter = 1;	char *returnvalue;	IFDEBUG(N)		fprintf(stdout, "Malloc 0x%x, %d, bytesmalloced %d\n",			total,total, bytesmalloced);		fflush(stdout);	ENDDEBUG	IFDEBUG(M)		fprintf(stdout, "Malloc 0x%x, %d, hiwat 0x%x\n",			total,total, hiwat);		fflush(stdout);	ENDDEBUG	if(firsttime) {		hiwat = sbrk(0);		if(((unsigned)(hiwat) & 0x3)) {			bytesmalloced = 4 - (int) ((unsigned)(hiwat) & 0x3);			hiwat = sbrk( bytesmalloced );		} else 			bytesmalloced = 0;		firsttime = 0;		highend = hiwat;	}	while( total ) {		x = MIN(CHUNKSIZE, total);		if(total != x)  {			IFDEBUG(N)				fprintf(stdout, "BIG Malloc tot %d, x %d, left %d net %d\n",					total,x, total-x, bytesmalloced);				fflush(stdout);			ENDDEBUG		}		if ( (hiwat + x) > highend) {			c = sbrk(CHUNKSIZE);			IFDEBUG(M)				fprintf(stdout, "hiwat 0x%x, x 0x%x, highend 0x%x, c 0x%x\n",						hiwat, x, highend, c);				fflush(stdout);			ENDDEBUG			if( c == (char *) -1 ) {				fprintf(stderr, "Ran out of memory!\n");				Exit(-1);			}			if(first_iter) {				returnvalue = c;				first_iter = 0;			}			bytesmalloced +=  CHUNKSIZE;			IFDEBUG(m)				if (highend != c) {					fprintf(OUT, "warning: %d wasted bytes!\n", highend - hiwat);				fprintf(OUT, " chunksize 0x%x,  x 0x%x \n", CHUNKSIZE, x);				}			ENDDEBUG			highend = c + CHUNKSIZE;			hiwat = c;		}		c = hiwat;		if(first_iter) {			returnvalue = c;			first_iter = 0;		}		hiwat += x;		total -= x;	}	if((unsigned)hiwat & 0x3) {		byteswasted += (int)((unsigned)(hiwat) & 0x3);		hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);	}	IFDEBUG(M)		fprintf(stdout, "Malloc = 0x%x, bytesm 0x%x, wasted 0x%x, hiwat 0x%x\n",			returnvalue, bytesmalloced, byteswasted, hiwat);	ENDDEBUG	IFDEBUG(N)		fprintf(stdout, "Malloc returns 0x%x, sbrk(0) 0x%x\n", returnvalue, sbrk(0));		fflush(stdout);	ENDDEBUG	return(returnvalue);}

⌨️ 快捷键说明

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