亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? alloc.c

?? TCPIP協議包
?? C
字號:
/* memory allocation routines
 *
 * Adapted from alloc routine in K&R; memory statistics and interrupt
 * protection added for use with net package. Must be used in place of
 * standard Turbo-C library routines because the latter check for stack/heap
 * collisions. This causes erroneous failures because process stacks are
 * allocated off the heap.
 */

#include <stdio.h>
#include <dos.h>
#include "global.h"
#include "mbuf.h"
#include "proc.h"
#include "cmdparse.h"

static unsigned long Memfail;	/* Count of allocation failures */
static unsigned long Allocs;	/* Total allocations */
static unsigned long Frees;	/* Total frees */
static unsigned long Invalid;	/* Total calls to free with garbage arg */
static int Memwait;		/* Number of tasks waiting for memory */
static unsigned long Yellows;	/* Yellow alert garbage collections */
static unsigned long Reds;	/* Red alert garbage collections */
unsigned long Availmem;		/* Heap memory, ABLKSIZE units */
static unsigned long Morecores;
static int Memdebug;
static unsigned long Sizes[16];

/* This debugging pattern MUST be exactly equal in size to the "header"
 * union defined later
 */
static char Debugpat[] = { 0xfe,0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef };

static int domdebug(int argc,char *argv[],void *ptr);
static int dostat(int argc,char *argv[],void *p);
static int dofreelist(int argc,char *argv[],void *p);
static int dothresh(int argc,char *argv[],void *p);
static int dosizes(int argc,char *argv[],void *p);

struct cmds Memcmds[] = {
	"debug",	domdebug,	0, 0, NULL,
	"freelist",	dofreelist,	0, 0, NULL,
	"sizes",	dosizes,	0, 0, NULL,
	"status",	dostat,		0, 0, NULL,
	"thresh",	dothresh,	0, 0, NULL,
	NULL,
};

#ifdef	LARGEDATA
#define	HUGE	huge
#else
#define	HUGE
#endif

union header {
	struct {
		union header HUGE *ptr;
		unsigned long size;
	} s;
	char c[8];	/* For debugging; also ensure size is 8 bytes */
};

typedef union header HEADER;

#define	ABLKSIZE	(sizeof (HEADER))
#define	BTOU(nb)	((((nb) + ABLKSIZE - 1) / ABLKSIZE) + 1)

static HEADER HUGE *morecore(unsigned nu);

static HEADER Base;
static HEADER HUGE *Allocp = NULL;
static unsigned long Heapsize;


/* Memory blocks obtained from MS-DOS by allocmem() call */
struct sysblock {
	unsigned seg;
	unsigned npar;
};
#define	NSYSBLOCK	5
struct sysblock Sysblock[NSYSBLOCK];

/* Allocate block of 'nb' bytes */
void *
malloc(nb)
size_t nb;
{
	int i;
	int i_state;
	register HEADER HUGE *p, HUGE *q;
	register unsigned nu;

	if(nb == 0)
		return NULL;

	Allocs++;
	/* Record the size of this request */
	if((i = ilog2(nb)) >= 0)
		Sizes[i]++;
	
	/* Round up to full block, then add one for header */
	nu = BTOU(nb);

	i_state = dirps();
	/* Initialize heap pointers if necessary */
	if((q = Allocp) == NULL){
		Base.s.ptr = Allocp = q = &Base;
		Base.s.size = 1;
	}
	/* Search heap list */
	for(p = q->s.ptr; ; q = p, p = p->s.ptr){
		if(p->s.size >= nu){
			/* This chunk is at least as large as we need */
			if(p->s.size <= nu + 1){
				/* This is either a perfect fit (size == nu)
				 * or the free chunk is just one unit larger.
				 * In either case, alloc the whole thing,
				 * because there's no point in keeping a free
				 * block only large enough to hold the header.
				 */
				q->s.ptr = p->s.ptr;
			} else {
				/* Carve out piece from end of entry */
				p->s.size -= nu;
				p += p->s.size;
				p->s.size = nu;
			}
#ifdef	circular
			Allocp = q;
#endif
			p->s.ptr = p;	/* for auditing */
			Availmem -= p->s.size;
			p++;
			break;
		}
		/* We've searched all the way around the list without
		 * finding anything. Try to get more core from the system,
		 * unless we're in an interrupt handler
		 */
		if(p == Allocp && (!i_state || (p = morecore(nu)) == NULL)){
			p = NULL;
			Memfail++;
			break;
		}
	}
	restore(i_state);
#ifdef	LARGEDATA
	/* On the brain-damaged Intel CPUs in "large data" model,
	 * make sure the pointer's offset field isn't null
	 * (unless the entire pointer is null).
	 * The Turbo C compiler and certain
	 * library functions like strrchr() assume this.
	 */
	if(FP_OFF(p) == 0 && FP_SEG(p) != 0){
		/* Return denormalized but equivalent pointer */
		return (void *)MK_FP(FP_SEG(p)-1,16);
	}
#endif
	return (void *)p;
}
/* Get more memory from the system and put it on the heap */
static HEADER HUGE *
morecore(nu)
unsigned nu;
{
	char HUGE *cp;
	HEADER HUGE *up;
	unsigned size;
	unsigned segp;
	unsigned npar;
	struct sysblock *sp;
	int i;
	void *sbrk(int);	/***/

	Morecores++;
	size = nu * ABLKSIZE;
	/* First try to expand our main memory block */
	if((int)(cp = (char HUGE *)sbrk(size)) != -1){
		up = (HEADER *)cp;
		up->s.size = nu;
		up->s.ptr = up;	/* satisfy audit */
		free(up + 1);
		Heapsize += size;
		Frees--;	/* Nullify increment inside free() */
		return Allocp;
	}
#ifndef	__GNUC__
	/* That failed; the main memory block must have grown into another
	 * allocated block, or something else (e.g., the increase handles
	 * call in ioinit()) must have allocated memory just beyond it.
	 * Allocate or extend an additional memory block.
	 */
	npar = (size+16)/16;	/* Convert size from bytes to paragraphs */
	cp = NULL;
	for(sp=Sysblock,i=0;i < NSYSBLOCK;i++,sp++){
		if(sp->npar != 0){
			/* Try to expand this block */
			if(setblock(sp->seg,sp->npar + npar) != -1){
				/* Failed (-1 == SUCCESS; strange!) */
				continue;
			}
			/* Block expansion succeeded */
			cp = MK_FP(sp->seg + sp->npar,0);
			sp->npar += npar;
		} else {
			/* Allocate new block */
			if(allocmem(npar,&segp) != -1){
				return NULL;	/* Complete failure */
			}
			/* -1 indicates SUCCESS (strange) */
			sp->seg = segp;
			sp->npar = npar;
			cp = MK_FP(segp,0);
		}
		break;
	}
	if(cp != (char HUGE *)NULL){
		/* Expand or create succeeded, add to heap */
		up = (HEADER *)cp;
		up->s.size = (npar*16)/ABLKSIZE;
		up->s.ptr = up;	/* satisfy audit */
		free(up + 1);
		Heapsize += npar*16;
		Frees--;	/* Nullify increment inside free() */
		return Allocp;
	}
#endif	/* __GNUC__ */
	return NULL;
}

/* Put memory block back on heap */
void
free(blk)
void *blk;
{
	register HEADER HUGE *p, HUGE *q;
	unsigned short HUGE *ptr;
	int i_state;
	int i;

	if(blk == NULL)
		return;		/* Required by ANSI */
	Frees++;
	p = ((HEADER HUGE *)blk) - 1;
	/* Audit check */
	if(p->s.ptr != p){
		Invalid++;
		if(istate()){
			ptr = (unsigned short *)&blk;
			printf("free: WARNING! invalid pointer (%p) proc %s\n",
			 blk,Curproc->name);
			stktrace();

			logmsg(-1,"free: WARNING! invalid pointer (%p) pc = 0x%x %x proc %s\n",
			 blk,ptr[-1],ptr[-2],Curproc->name);
		}
		return;
	}
	Availmem += p->s.size;
	if(Memdebug){
		/* Fill data area with pattern to detect later overwrites */
		for(i=1;i<p->s.size;i++){
			memcpy(p[i].c,Debugpat,sizeof(Debugpat));
		}
	}
	i_state = dirps();
 	/* Search the free list looking for the right place to insert */
	for(q = Allocp; !(p > q && p < q->s.ptr); q = q->s.ptr){
		/* Highest address on circular list? */
		if(q >= q->s.ptr && (p > q || p < q->s.ptr))
			break;
	}
	if(p + p->s.size == q->s.ptr){
		/* Combine with front of this entry */
		p->s.size += q->s.ptr->s.size;
		p->s.ptr = q->s.ptr->s.ptr;
		if(Memdebug){
			memcpy(q->s.ptr->c,Debugpat,sizeof(Debugpat));
		}
	} else {
		/* Link to front of this entry */
		p->s.ptr = q->s.ptr;
	}
	if(q + q->s.size == p){
		/* Combine with end of this entry */
		q->s.size += p->s.size;
		q->s.ptr = p->s.ptr;
		if(Memdebug){
			memcpy(p->c,Debugpat,sizeof(Debugpat));
		}
	} else {
		/* Link to end of this entry */
		q->s.ptr = p;
	}
#ifdef	circular
	Allocp = q;
#endif
	restore(i_state);
	if(Memwait != 0)
		ksignal(&Memwait,0);
}

/* Move existing block to new area */
void *
realloc(area,size)
void *area;
size_t size;
{
	unsigned osize;
	HEADER HUGE *hp;
	void *new;

	hp = ((HEADER *)area) - 1;
	osize = (hp->s.size -1) * ABLKSIZE;

	/* We must copy the block since freeing it may cause the heap
	 * debugging code to scribble over it.
	 */
	if((new = malloc(size)) != NULL)
		memcpy(new,area,size>osize? osize : size);
	free(area);
	return new;
}

/* Allocate block of cleared memory */
void *
calloc(nelem,size)
size_t nelem;	/* Number of elements */
size_t size;	/* Size of each element */
{
	register unsigned i;
	register char *cp;

	i = nelem * size;
	if((cp = malloc(i)) != NULL)
		memset(cp,0,i);
	return cp;
}
/* Version of malloc() that waits if necessary for memory to become available */
void *
mallocw(nb)
size_t nb;
{
	register void *p;

	while((p = malloc(nb)) == NULL){
		Memwait++;
		kwait(&Memwait);
		Memwait--;
	}
	return p;
}
/* Version of calloc that waits if necessary for memory to become available */
void *
callocw(nelem,size)
unsigned nelem;	/* Number of elements */
unsigned size;	/* Size of each element */
{
	register unsigned i;
	register char *cp;

	i = nelem * size;
	cp = mallocw(i);
	memset(cp,0,i);
	return cp;
}
/* Return 0 if at least Memthresh memory is available. Return 1 if
 * less than Memthresh but more than Memthresh/2 is available; i.e.,
 * if a yellow garbage collection should be performed. Return 2 if
 * less than Memthresh/2 is available, i.e., a red collection should
 * be performed.
 */
int
availmem()
{
	void *p;

	if(Availmem*ABLKSIZE >= Memthresh)
		return 0;	/* We're clearly OK */

	/* There's not enough on the heap; try calling malloc to see if
	 * it can get more from the system
	 */
	if((p = malloc(Memthresh)) != NULL){
		free(p);
		return 0;	/* Okay */
	}
	if((p = malloc(Memthresh/2)) != NULL){
		free(p);
		return 1;	/* Yellow alert */
	}
	return 2;		/* Red alert */
}

/* Print heap stats */
static int
dostat(argc,argv,envp)
int argc;
char *argv[];
void *envp;
{
	struct sysblock *sp;
	int i;

	printf("heap size %lu avail %lu (%lu%%) morecores %lu\n",
	 Heapsize,Availmem * ABLKSIZE,100L*Availmem*ABLKSIZE/Heapsize,
	 Morecores);
	if(Sysblock[0].npar != 0){
		printf("Extra blocks:");
		for(i=0,sp=Sysblock;i< NSYSBLOCK;i++,sp++){
			if(sp->npar == 0)
				break;
			printf(" (%x0-%x0)",sp->seg,sp->seg+sp->npar);
		}
		printf("\n");
	}
	printf("allocs %lu frees %lu (diff %lu) alloc fails %lu invalid frees %lu\n",
		Allocs,Frees,Allocs-Frees,Memfail,Invalid);
	printf("garbage collections yellow %lu red %lu\n",Yellows,Reds);
	printf("\n");
	mbufstat();
	return 0;
}

/* Print heap free list */
static int
dofreelist(argc,argv,envp)
int argc;
char *argv[];
void *envp;
{
	HEADER HUGE *p;
	int i = 0;
	int j;
	unsigned corrupt;
	int i_state;

	for(p = Base.s.ptr;p != (HEADER HUGE *)&Base;p = p->s.ptr){
		corrupt = 0;
		if(Memdebug){
			i_state = dirps();
			for(j=1;j<p->s.size;j++){
				if(memcmp(p[j].c,Debugpat,sizeof(Debugpat)) != 0){
					corrupt = j;
					break;
				}
			}
			restore(i_state);
		}
		if(corrupt)
			printf("%p %6lu C: %u",p,p->s.size * ABLKSIZE,corrupt);
		else
			printf("%p %6lu",p,p->s.size * ABLKSIZE);

		if(++i == 4){
			i = 0;
			if(printf("\n") == EOF)
				return 0;
		} else
			printf(" | ");
	}
	if(i != 0)
		printf("\n");
	return 0;
}
static int
dosizes(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	int i;

	for(i=0;i<16;i += 4){
		printf("N>=%5u:%7ld| N>=%5u:%7ld| N>=%5u:%7ld| N>=%5u:%7ld\n",
		 1<<i,Sizes[i],	2<<i,Sizes[i+1],
		 4<<i,Sizes[i+2],8<<i,Sizes[i+3]);
	}
	mbufsizes();
	return 0;
}
int
domem(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return subcmd(Memcmds,argc,argv,p);
}

static int
dothresh(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	return setlong(&Memthresh,"Free memory threshold (bytes)",argc,argv);
}
static int
domdebug(argc,argv,ptr)
int argc;
char *argv[];
void *ptr;
{
	int prev,j,i_state;
	HEADER HUGE *p;

	prev = Memdebug;
	setbool(&Memdebug,"Heap debugging",argc,argv);
	if(prev == 1 || Memdebug == 0)
		return 0;

	/* Turning debugging on; reinitialize free areas to debug pattern */
	i_state = dirps();
	for(p = Base.s.ptr;p != (HEADER HUGE *)&Base;p = p->s.ptr){
		for(j=1;j<p->s.size;j++){
			memcpy(p[j].c,Debugpat,sizeof(Debugpat));
		}
	}
	restore(i_state);
	return 0;
}

/* Background memory compactor, used when memory runs low */
void
gcollect(i,v1,v2)
int i;	/* Args not used */
void *v1;
void *v2;
{
	void (**fp)(int);
	int red;

	for(;;){
		ppause(1000L);	/* Run every second */
		/* If memory is low, collect some garbage. If memory is VERY
		 * low, invoke the garbage collection routines in "red" mode.
		 */
		switch(availmem()){
		case 0:
			continue;	/* All is well */
		case 1:
			red = 0;
			Yellows++;
			break;
		case 2:
			red = 1;
			Reds++;
			break;
		}
		for(fp = Gcollect;*fp != NULL;fp++)
			(**fp)(red);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产一区二区在线播放| 懂色av噜噜一区二区三区av| 国内精品视频666| 91麻豆免费看片| 精品对白一区国产伦| 亚洲成av人片在线观看| 成人黄页毛片网站| 精品福利二区三区| 亚洲mv在线观看| 99久久精品情趣| 精品国产1区二区| 日本aⅴ亚洲精品中文乱码| 成人黄色小视频在线观看| 欧美mv日韩mv国产| 午夜视频一区二区三区| 日本久久精品电影| 国产精品久久久久久久久久久免费看 | 99在线精品观看| 欧美精品一区二区蜜臀亚洲| 亚洲第一电影网| 91国模大尺度私拍在线视频| 久久精品欧美一区二区三区不卡 | 69成人精品免费视频| 亚洲主播在线播放| 欧美综合久久久| 一区二区三区在线观看网站| 色婷婷精品久久二区二区蜜臂av| 中文av一区二区| 这里只有精品免费| 亚洲自拍欧美精品| 在线视频一区二区免费| 一区二区三区在线视频观看 | 亚洲欧洲精品一区二区精品久久久| 激情五月婷婷综合网| 日韩欧美中文字幕制服| 精品写真视频在线观看| 久久新电视剧免费观看| 国产成人精品三级| 中文字幕av一区二区三区高| 成人一区二区在线观看| 国产精品美女久久久久av爽李琼 | 国产精品77777| 中文字幕中文乱码欧美一区二区| 97久久超碰国产精品电影| 一区二区在线观看不卡| 在线看国产一区| 日本成人在线不卡视频| 欧美电影免费观看高清完整版| 麻豆成人91精品二区三区| 国产欧美精品国产国产专区| 91蝌蚪porny成人天涯| 亚洲一区二区欧美| 日韩一区二区免费视频| 国产精品自拍av| 亚洲乱码日产精品bd| 欧美日韩高清在线| 国产电影精品久久禁18| 亚洲精品videosex极品| 欧美一区二区啪啪| 国产激情一区二区三区桃花岛亚洲| 国产精品久久久久久久岛一牛影视| 色先锋aa成人| 久久精品国产在热久久| 亚洲视频中文字幕| 欧美伦理影视网| 国产成人免费在线观看| 一区二区在线观看免费视频播放| 91精品国产综合久久精品性色| 国产伦精品一区二区三区视频青涩 | 国产伦精品一区二区三区免费迷 | 一区二区三区日韩欧美| 欧美一级午夜免费电影| 粉嫩13p一区二区三区| 亚洲成av人影院在线观看网| 国产午夜精品久久| 欧美日韩精品电影| 成人h动漫精品一区二| 视频一区二区三区入口| 国产精品久久久久久久蜜臀| 精品三级在线看| 欧美午夜精品免费| 高清不卡在线观看| 日本少妇一区二区| 亚洲免费高清视频在线| 欧美精品一区二区三区久久久| 欧美三级视频在线观看| 成人av资源下载| 国产一区视频导航| 午夜精品成人在线视频| 中文字幕一区二区三区不卡在线 | 91精品欧美福利在线观看| 99久久精品国产网站| 国产乱理伦片在线观看夜一区| 亚洲不卡在线观看| 伊人婷婷欧美激情| 国产精品美女久久久久aⅴ| 欧美xxx久久| 日韩欧美一区二区三区在线| 欧美日产国产精品| 在线看国产日韩| 色噜噜狠狠成人中文综合| 成人免费的视频| 丁香一区二区三区| 国产成人综合在线观看| 国内偷窥港台综合视频在线播放| 日韩成人一级片| 免费看欧美美女黄的网站| 日韩电影一二三区| 日本v片在线高清不卡在线观看| 亚洲bdsm女犯bdsm网站| 亚洲一区二区三区在线| 亚洲精品国久久99热| 中文字幕一区二区三区四区不卡| 欧美激情一区二区三区在线| 中文字幕久久午夜不卡| 国产精品久久久久久久久久久免费看| 国产视频一区在线观看| 日本一区二区三区国色天香| 国产亚洲成年网址在线观看| 国产香蕉久久精品综合网| 国产三级一区二区三区| 国产清纯在线一区二区www| 国产欧美一区视频| 亚洲欧美日本在线| 亚洲一区二区三区免费视频| 亚洲一区二区三区四区五区中文| 亚洲一区二区精品久久av| 亚洲国产精品久久一线不卡| 丝袜美腿亚洲综合| 久久99精品久久久久久| 大胆欧美人体老妇| 色88888久久久久久影院按摩| 欧美日韩一区二区三区四区| 91麻豆精品国产91久久久更新时间| 91麻豆精品国产自产在线| 欧美电影免费观看高清完整版在 | 免费欧美日韩国产三级电影| 久久狠狠亚洲综合| 成人一道本在线| 欧美亚州韩日在线看免费版国语版| 欧美日韩亚洲综合在线 | 精品播放一区二区| 专区另类欧美日韩| 日日噜噜夜夜狠狠视频欧美人 | 色老头久久综合| 精品国产一区二区三区忘忧草| 国产精品嫩草99a| 偷窥国产亚洲免费视频| 国产精品主播直播| 在线视频一区二区三| www欧美成人18+| 亚洲一级二级在线| 狠狠色狠狠色综合| 91久久精品一区二区二区| 欧美成人r级一区二区三区| 亚洲欧洲一区二区在线播放| 日韩高清一区二区| 成人黄色小视频在线观看| 欧美一区二区精品| 最新日韩av在线| 视频一区中文字幕国产| 成人av影视在线观看| 欧美一二三四区在线| 亚洲欧洲精品天堂一级| 麻豆国产欧美日韩综合精品二区| 一本一本大道香蕉久在线精品| 久久综合色天天久久综合图片| 一区二区三区丝袜| 成人精品视频一区二区三区尤物| 欧美美女网站色| 樱桃视频在线观看一区| 成人免费毛片app| 日韩午夜在线观看视频| 亚洲女与黑人做爰| 国产不卡视频在线播放| 精品国产青草久久久久福利| 亚洲国产乱码最新视频| 91免费精品国自产拍在线不卡| 精品国产制服丝袜高跟| 日韩成人免费电影| 在线观看三级视频欧美| 成人免费在线观看入口| 成人性生交大片免费看在线播放 | 91精品国产欧美一区二区成人| 亚洲视频综合在线| 成人免费黄色大片| 久久精品一区二区三区不卡| 日韩高清一区在线| 欧美电影一区二区| 亚洲国产精品一区二区www| 91一区二区三区在线观看| 亚洲欧洲日韩一区二区三区| 成人午夜激情在线| 国产欧美日韩在线视频| 国产又黄又大久久| 精品国产123| 国产激情视频一区二区三区欧美 | 欧美极品xxx| 福利视频网站一区二区三区| 国产色产综合产在线视频|