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

📄 lmm_free.c

📁 操作系统试验!通过这个试验
💻 C
字号:
/* * lmm_free.c * Modified for use in 15-410 at CMU * Zachary Anderson(zra) *//* * Copyright (c) 1995, 1998-1999 University of Utah and the Flux Group. * All rights reserved. *  * This file is part of the Flux OSKit.  The OSKit is free software, also known * as "open source;" you can redistribute it and/or modify it under the terms * of the GNU General Public License (GPL), version 2, as published by the Free * Software Foundation (FSF).  To explore alternate licensing terms, contact * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. *  * The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GPL for more details.  You should have * received a copy of the GPL along with the OSKit; see the file COPYING.  If * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. */#include "lmm.h"void lmm_free(lmm_t *lmm, void *block, int size){	struct lmm_region *reg;	struct lmm_node *node = (struct lmm_node*)				((unsigned int)block & ~ALIGN_MASK);	struct lmm_node *prevnode, *nextnode;	assert(lmm != 0);	assert(block != 0);	assert(size > 0);	size = (((unsigned int)block & ALIGN_MASK) + size + ALIGN_MASK)		& ~ALIGN_MASK;	/* First find the region to add this block to.  */	for (reg = lmm->regions; ; reg = reg->next)	{		assert(reg != 0);		CHECKREGPTR(reg);		if (((unsigned int)node >= reg->min)		    && ((unsigned int)node < reg->max))			break;	}	/* Record the newly freed space in the region's free space counter.  */	reg->free += size;	assert(reg->free <= reg->max - reg->min);	/* Now find the location in that region's free list	   at which to add the node.  */	for (prevnode = 0, nextnode = reg->nodes;	     (nextnode != 0) && (nextnode < node);	     prevnode = nextnode, nextnode = nextnode->next);	/* Coalesce the new free chunk into the previous chunk if possible.  */	if ((prevnode) &&	    ((unsigned int)prevnode + prevnode->size >= (unsigned int)node))	{		assert((unsigned int)prevnode + prevnode->size		       == (unsigned int)node);		/* Coalesce prevnode with nextnode if possible.  */		if (((unsigned int)nextnode)		    && ((unsigned int)node + size >= (unsigned int)nextnode))		{			assert((unsigned int)node + size			       == (unsigned int)nextnode);			prevnode->size += size + nextnode->size;			prevnode->next = nextnode->next;		}		else		{			/* Not possible -			   just grow prevnode around newly freed memory.  */			prevnode->size += size;		}	}	else	{		/* Insert the new node into the free list.  */		if (prevnode)			prevnode->next = node;		else			reg->nodes = node;		/* Try coalescing the new node with the nextnode.  */		if ((nextnode) &&		    (unsigned int)node + size >= (unsigned int)nextnode)		{			node->size = size + nextnode->size;			node->next = nextnode->next;		}		else		{			node->size = size;			node->next = nextnode;		}	}}

⌨️ 快捷键说明

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