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

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

?? z_zone.c

?? 游戲類程序源代碼---WinDoom 3D源程序.zip
?? C
字號:
// Emacs style mode select   -*- C++ -*- 
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// $Log:$
//
// DESCRIPTION:
//	Zone Memory Allocation. Neat.
//
//-----------------------------------------------------------------------------

static const char
rcsid[] = "$Id: z_zone.c,v 1.4 1997/02/03 16:47:58 b1 Exp $";

#include "z_zone.h"
#include "i_system.h"
#include "doomdef.h"

char MsgText[256];
void WriteDebug(char *);

//
// ZONE MEMORY ALLOCATION
//
// There is never any space between memblocks,
//  and there will never be two contiguous free memblocks.
// The rover can be left pointing at a non-empty block.
//
// It is of no value to free a cachable block,
//  because it will get overwritten automatically if needed.
// 
 
#define ZONEID	0x1d4a11


typedef struct
{
    // total bytes malloced, including header
    int		size;

    // start / end cap for linked list
    memblock_t	blocklist;
    
    memblock_t*	rover;
    
} memzone_t;



memzone_t*	mainzone;



//
// Z_ClearZone
//
void Z_ClearZone (memzone_t* zone)
{
    memblock_t*		block;
	
    // set the entire zone to one free block
    zone->blocklist.next =
	zone->blocklist.prev =
	block = (memblock_t *)( (byte *)zone + sizeof(memzone_t) );
    
    zone->blocklist.user = (void *)zone;
    zone->blocklist.tag = PU_STATIC;
    zone->rover = block;
	
    block->prev = block->next = &zone->blocklist;
    
    // NULL indicates a free block.
    block->user = NULL;	

    block->size = zone->size - sizeof(memzone_t);
}



//
// Z_Init
//
void Z_Init (void)
{
    memblock_t*	block;
    int		size;

    mainzone = (memzone_t *)I_ZoneBase (&size);
    mainzone->size = size;

    // set the entire zone to one free block
    mainzone->blocklist.next =
	mainzone->blocklist.prev =
	block = (memblock_t *)( (byte *)mainzone + sizeof(memzone_t) );

    mainzone->blocklist.user = (void *)mainzone;
    mainzone->blocklist.tag = PU_STATIC;
    mainzone->rover = block;
	
    block->prev = block->next = &mainzone->blocklist;

    // NULL indicates a free block.
    block->user = NULL;
    
    block->size = mainzone->size - sizeof(memzone_t);
}


//
// Z_Free
//
void Z_Free (void* ptr)
{
    memblock_t*		block;
    memblock_t*		other;
	
    block = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t));

    if (block->id != ZONEID)
	I_Error ("Z_Free: freed a pointer without ZONEID");
		
    if (block->user > (void **)0x100)
    {
	// smaller values are not pointers
	// Note: OS-dependend?
	
	// clear the user's mark
	*block->user = 0;
    }

    // mark as free
    block->user = NULL;	
    block->tag = 0;
    block->id = 0;
	
    other = block->prev;

    if (!other->user)
    {
	// merge with previous free block
	other->size += block->size;
	other->next = block->next;
	other->next->prev = other;

	if (block == mainzone->rover)
	    mainzone->rover = other;

	block = other;
    }
	
    other = block->next;
    if (!other->user)
    {
	// merge the next free block onto the end
	block->size += other->size;
	block->next = other->next;
	block->next->prev = block;

	if (other == mainzone->rover)
	    mainzone->rover = block;
    }
}



//
// Z_Malloc
// You can pass a NULL user if the tag is < PU_PURGELEVEL.
//
#define MINFRAGMENT		64


void*
Z_Malloc
( int		size,
  int		tag,
  void*		user )
{
    int		extra;
    memblock_t*	start;
    memblock_t* rover;
    memblock_t* newblock;
    memblock_t*	base;

    size = (size + 3) & ~3;
    
    // scan through the block list,
    // looking for the first free block
    // of sufficient size,
    // throwing out any purgable blocks along the way.

    // account for size of block header
    size += sizeof(memblock_t);
    
    // if there is a free block behind the rover,
    //  back up over them
    base = mainzone->rover;
    
    if (!base->prev->user)
	base = base->prev;
	
    rover = base;
    start = base->prev;
	
    do
    {
	if (rover == start)
	{
	    // scanned all the way around the list
	    I_Error ("Z_Malloc: failed on allocation of %i bytes", size);
	}
	
	if (rover->user)
	{
	    if (rover->tag < PU_PURGELEVEL)
	    {
		// hit a block that can't be purged,
		//  so move base past it
		base = rover = rover->next;
	    }
	    else
	    {
		// free the rover block (adding the size to base)

		// the rover can be the base block
		base = base->prev;
		Z_Free ((byte *)rover+sizeof(memblock_t));
		base = base->next;
		rover = base->next;
	    }
	}
	else
	    rover = rover->next;
    } while (base->user || base->size < size);

    
    // found a block big enough
    extra = base->size - size;
    
    if (extra >  MINFRAGMENT)
    {
	// there will be a free fragment after the allocated block
	newblock = (memblock_t *) ((byte *)base + size );
	newblock->size = extra;
	
	// NULL indicates free block.
	newblock->user = NULL;	
	newblock->tag = 0;
	newblock->prev = base;
	newblock->next = base->next;
	newblock->next->prev = newblock;

	base->next = newblock;
	base->size = size;
    }
	
    if (user)
    {
	// mark as an in use block
	base->user = user;			
	*(void **)user = (void *) ((byte *)base + sizeof(memblock_t));
    }
    else
    {
	if (tag >= PU_PURGELEVEL)
	    I_Error ("Z_Malloc: an owner is required for purgable blocks");

	// mark as in use, but unowned	
	base->user = (void *)2;		
    }
    base->tag = tag;

    // next allocation will start looking here
    mainzone->rover = base->next;	
	
    base->id = ZONEID;
    
    return (void *) ((byte *)base + sizeof(memblock_t));
}



//
// Z_FreeTags
//
void
Z_FreeTags
( int		lowtag,
  int		hightag )
{
    memblock_t*	block;
    memblock_t*	next;
	
    for (block = mainzone->blocklist.next ;
	 block != &mainzone->blocklist ;
	 block = next)
    {
	// get link before freeing
	next = block->next;

	// free block?
	if (!block->user)
	    continue;
	
	if (block->tag >= lowtag && block->tag <= hightag)
	    Z_Free ( (byte *)block+sizeof(memblock_t));
    }
}



//
// Z_DumpHeap
// Note: TFileDumpHeap( stdout ) ?
//
void
Z_DumpHeap
( int		lowtag,
  int		hightag )
{
    memblock_t*	block;
	
    sprintf (MsgText, "zone size: %i  location: %p\n",
	    mainzone->size,mainzone);
    WriteDebug(MsgText);
    
    sprintf (MsgText,"tag range: %i to %i\n",
	    lowtag, hightag);
    WriteDebug(MsgText);
	
    for (block = mainzone->blocklist.next ; ; block = block->next)
    {
	if (block->tag >= lowtag && block->tag <= hightag)
       {
	    sprintf (MsgText,"block:%p    size:%7i    user:%p    tag:%3i\n",
		    block, block->size, block->user, block->tag);
        WriteDebug(MsgText);
       }
		
	if (block->next == &mainzone->blocklist)
	{
	    // all blocks have been hit
	    break;
	}
	
	if ( (byte *)block + block->size != (byte *)block->next)
       {
	    sprintf(MsgText, "ERROR: block size does not touch the next block\n");
        WriteDebug(MsgText);
       }

	if ( block->next->prev != block)
       {
	    sprintf(MsgText, "ERROR: next block doesn't have proper back link\n");
        WriteDebug(MsgText);
       }

	if (!block->user && !block->next->user)
       {
	    sprintf(MsgText, "ERROR: two consecutive free blocks\n");
        WriteDebug(MsgText);
       }
    }
}


//
// Z_FileDumpHeap
//
void Z_FileDumpHeap (FILE* f)
{
    memblock_t*	block;
	
    fprintf (f,"zone size: %i  location: %p\n",mainzone->size,mainzone);
	
    for (block = mainzone->blocklist.next ; ; block = block->next)
    {
	fprintf (f,"block:%p    size:%7i    user:%p    tag:%3i\n",
		 block, block->size, block->user, block->tag);
		
	if (block->next == &mainzone->blocklist)
	{
	    // all blocks have been hit
	    break;
	}
	
	if ( (byte *)block + block->size != (byte *)block->next)
	    fprintf (f,"ERROR: block size does not touch the next block\n");

	if ( block->next->prev != block)
	    fprintf (f,"ERROR: next block doesn't have proper back link\n");

	if (!block->user && !block->next->user)
	    fprintf (f,"ERROR: two consecutive free blocks\n");
    }
}



//
// Z_CheckHeap
//
void Z_CheckHeap (void)
{
    memblock_t*	block;
	
    for (block = mainzone->blocklist.next ; ; block = block->next)
    {
	if (block->next == &mainzone->blocklist)
	{
	    // all blocks have been hit
	    break;
	}
	
	if ( (byte *)block + block->size != (byte *)block->next)
	    I_Error ("Z_CheckHeap: block size does not touch the next block\n");

	if ( block->next->prev != block)
	    I_Error ("Z_CheckHeap: next block doesn't have proper back link\n");

	if (!block->user && !block->next->user)
	    I_Error ("Z_CheckHeap: two consecutive free blocks\n");
    }
}




//
// Z_ChangeTag
//
void
Z_ChangeTag2
( void*		ptr,
  int		tag )
{
    memblock_t*	block;
	
    block = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t));

    if (block->id != ZONEID)
	I_Error ("Z_ChangeTag: freed a pointer without ZONEID");

    if (tag >= PU_PURGELEVEL && (unsigned)block->user < 0x100)
	I_Error ("Z_ChangeTag: an owner is required for purgable blocks");

    block->tag = tag;
}



//
// Z_FreeMemory
//
int Z_FreeMemory (void)
{
    memblock_t*		block;
    int			free;
	
    free = 0;
    
    for (block = mainzone->blocklist.next ;
	 block != &mainzone->blocklist;
	 block = block->next)
    {
	if (!block->user || block->tag >= PU_PURGELEVEL)
	    free += block->size;
    }
    return free;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色视频成人在线观看免| 久久久综合视频| 风间由美性色一区二区三区| 一区二区三区高清| 国产亚洲精久久久久久| 欧美人狂配大交3d怪物一区| www.亚洲激情.com| 国产精品99久久久久久久vr | 精品视频在线看| 国产精品77777| 日本美女一区二区三区视频| 亚洲黄色在线视频| 国产精品亲子乱子伦xxxx裸| 精品黑人一区二区三区久久| 欧美日韩国产色站一区二区三区| 成人免费视频app| 精品在线播放免费| 日本不卡高清视频| 亚洲电影一区二区三区| 亚洲女爱视频在线| 国产精品嫩草影院com| 国产婷婷色一区二区三区四区 | 欧美亚洲综合另类| 99久久精品99国产精品| 国产成人av自拍| 久久国产精品色婷婷| 日韩精品欧美成人高清一区二区| 亚洲图片欧美一区| 亚洲影视资源网| 亚洲在线视频免费观看| 亚洲人成网站影音先锋播放| 国产精品久久777777| 欧美激情一区在线观看| 中文字幕久久午夜不卡| 国产欧美日韩精品在线| 中文在线免费一区三区高中清不卡| 久久免费视频色| 久久女同精品一区二区| 久久免费看少妇高潮| 国产亚洲综合在线| 国产欧美日韩综合| 国产精品九色蝌蚪自拍| 18欧美乱大交hd1984| 国产精品盗摄一区二区三区| 最新日韩av在线| 亚洲人成伊人成综合网小说| 亚洲综合在线电影| 亚洲第一主播视频| 免费成人在线观看| 极品尤物av久久免费看| 国产精品123| jvid福利写真一区二区三区| 91在线免费视频观看| 欧美亚洲综合在线| 欧美一级黄色录像| 久久精品免费在线观看| 亚洲丝袜美腿综合| 天天操天天干天天综合网| 免费看精品久久片| 国产精品91一区二区| av网站免费线看精品| 欧美性猛交xxxx黑人交| 日韩一区和二区| 国产精品午夜久久| 亚洲国产cao| 国产一区二区三区免费观看| 99久久99久久综合| 欧美日韩精品一区视频| 久久亚区不卡日本| 亚洲色图视频网站| 麻豆精品在线观看| 97se亚洲国产综合在线| 欧美一区二区三区不卡| 国产欧美日韩另类视频免费观看| 亚洲一区二区欧美激情| 美女网站色91| 在线一区二区三区四区五区 | 精品一区二区三区视频在线观看| 国产九色sp调教91| 欧美午夜影院一区| 久久久久久97三级| 午夜欧美在线一二页| 国产成人av资源| 56国语精品自产拍在线观看| 国产欧美一区二区在线| 亚洲成人动漫av| 懂色av一区二区三区免费看| 欧美精品一级二级三级| 国产精品福利一区| 麻豆成人综合网| 色综合久久中文综合久久97| 久久亚洲免费视频| 日韩精品视频网站| 色哟哟国产精品| 久久精品网站免费观看| 视频一区二区欧美| 91在线观看美女| 久久久蜜桃精品| 日韩成人一级片| 91麻豆产精品久久久久久| 精品av综合导航| 丝袜美腿亚洲综合| 日本精品视频一区二区三区| 国产欧美一区二区三区在线看蜜臀 | 日韩高清不卡在线| 91免费精品国自产拍在线不卡| 精品久久久久久久人人人人传媒| 亚洲高清视频的网址| 91首页免费视频| 国产精品素人一区二区| 国产毛片一区二区| 欧美大胆人体bbbb| 午夜精品免费在线观看| 91一区二区三区在线观看| 国产精品色呦呦| 国产一区中文字幕| 日韩视频国产视频| 日韩国产欧美在线播放| 精品视频免费看| 日韩美女精品在线| 99re热这里只有精品免费视频| 久久久久久影视| 久久精品国产澳门| 9191国产精品| 污片在线观看一区二区 | 国产欧美视频一区二区| 国产在线视视频有精品| 日韩一区二区在线观看视频 | 亚洲成av人片一区二区| 日本韩国一区二区三区| 亚洲制服欧美中文字幕中文字幕| 91激情五月电影| 亚洲国产视频在线| 欧美日韩精品综合在线| 视频一区二区中文字幕| 日韩一区和二区| 韩国三级在线一区| 久久久亚洲午夜电影| 成人性视频网站| 亚洲欧洲在线观看av| 色婷婷av一区| 亚洲在线视频免费观看| 欧美日韩高清一区二区| 日本怡春院一区二区| 欧美videos中文字幕| 国产精品白丝jk白祙喷水网站| 国产欧美精品一区二区三区四区| 国产成人av一区| 亚洲免费在线观看视频| 欧美老肥妇做.爰bbww视频| 视频在线观看91| 精品91自产拍在线观看一区| 成人丝袜视频网| 亚洲青青青在线视频| 欧美肥妇毛茸茸| 国产一区二区三区综合| 国产精品毛片大码女人| 日本精品一区二区三区高清| 午夜精品aaa| 欧美大黄免费观看| 成人高清视频在线观看| 亚洲综合视频在线| 日韩视频国产视频| 成人黄页毛片网站| 亚洲成在线观看| 久久久青草青青国产亚洲免观| 91天堂素人约啪| 日韩电影免费在线看| 中文字幕久久午夜不卡| 欧美日韩免费一区二区三区视频 | 白白色亚洲国产精品| 亚洲综合在线观看视频| 亚洲精品在线观| 色综合久久久久久久| 日本中文一区二区三区| 国产精品免费看片| 在线成人av影院| av一区二区三区| 免费在线欧美视频| 成人欧美一区二区三区1314| 欧美一二三区在线观看| 91丨九色丨蝌蚪丨老版| 久久国产精品露脸对白| 亚洲免费观看高清| 国产亚洲美州欧州综合国| 欧美日韩精品一区二区| 成人免费观看视频| 另类小说视频一区二区| 国产精品久久久久久久久久免费看| 欧美日韩国产影片| 91在线观看成人| 国产精品1区2区| 蜜桃久久久久久久| 亚洲影院在线观看| 亚洲欧洲国产专区| 久久午夜老司机| 日韩欧美精品在线视频| 欧美亚洲丝袜传媒另类| 不卡的av在线播放| 精久久久久久久久久久|