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

📄 free.c

📁 linux内核
💻 C
字号:
/* * free.c * * Very simple linked-list based malloc()/free(). */#include <stdlib.h>#include "malloc.h"static struct free_arena_header *__free_block(struct free_arena_header *ah){  struct free_arena_header *pah, *nah;  pah = ah->a.prev;  nah = ah->a.next;  if ( pah->a.type == ARENA_TYPE_FREE &&       (char *)pah+pah->a.size == (char *)ah ) {    /* Coalesce into the previous block */    pah->a.size += ah->a.size;    pah->a.next = nah;    nah->a.prev = pah;#ifdef DEBUG_MALLOC    ah->a.type = ARENA_TYPE_DEAD;#endif    ah = pah;    pah = ah->a.prev;  } else {    /* Need to add this block to the free chain */    ah->a.type = ARENA_TYPE_FREE;    ah->next_free = __malloc_head.next_free;    ah->prev_free = &__malloc_head;    __malloc_head.next_free = ah;    ah->next_free->prev_free = ah;  }  /* In either of the previous cases, we might be able to merge     with the subsequent block... */  if ( nah->a.type == ARENA_TYPE_FREE &&       (char *)ah+ah->a.size == (char *)nah ) {    ah->a.size += nah->a.size;    /* Remove the old block from the chains */    nah->next_free->prev_free = nah->prev_free;    nah->prev_free->next_free = nah->next_free;    ah->a.next = nah->a.next;    nah->a.next->a.prev = ah;#ifdef DEBUG_MALLOC    nah->a.type = ARENA_TYPE_DEAD;#endif  }  /* Return the block that contains the called block */  return ah;}void free(void *ptr){  struct free_arena_header *ah;  if ( !ptr )    return;  ah = (struct free_arena_header *)    ((struct arena_header *)ptr - 1);#ifdef DEBUG_MALLOC  assert( ah->a.type == ARENA_TYPE_USED );#endif  __free_block(ah);  /* Here we could insert code to return memory to the system. */}

⌨️ 快捷键说明

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