goomsl_heap.c

来自「linux下的MPEG1」· C语言 代码 · 共 106 行

C
106
字号
#include "goomsl_heap.h"#include <stdlib.h>struct _GOOM_HEAP {  void **arrays;  int number_of_arrays;  int size_of_each_array;  int consumed_in_last_array;};/* Constructors / Destructor */GoomHeap *goom_heap_new(void){  return goom_heap_new_with_granularity(4096);}GoomHeap *goom_heap_new_with_granularity(int granularity){  GoomHeap *_this;  _this = (GoomHeap*)malloc(sizeof(GoomHeap));  _this->number_of_arrays   = 0;  _this->size_of_each_array = granularity;  _this->consumed_in_last_array = 0;  _this->arrays = (void**)malloc(sizeof(void*));  return _this;}void goom_heap_delete(GoomHeap *_this){  int i;  for (i=0;i<_this->number_of_arrays;++i) {    free(_this->arrays[i]);  }  free(_this->arrays);  free(_this);}static void align_it(GoomHeap *_this, int alignment){  if ((alignment > 1) && (_this->number_of_arrays>0)) {    void *last_array = _this->arrays[_this->number_of_arrays - 1];    long  last_address = (long)last_array + _this->consumed_in_last_array;    int   decal = (last_address % alignment);    if (decal != 0) {      _this->consumed_in_last_array += alignment - decal;    }  }}void     *goom_heap_malloc_with_alignment_prefixed(GoomHeap *_this, int nb_bytes,                                                   int alignment, int prefix_bytes){  void *retval = NULL;    /* d'abord on gere les problemes d'alignement */  _this->consumed_in_last_array += prefix_bytes;  align_it(_this, alignment);  /* ensuite on verifie que la quantite de memoire demandee tient dans le buffer */  if ((_this->consumed_in_last_array + nb_bytes >= _this->size_of_each_array)      || (_this->number_of_arrays == 0)) {    if (prefix_bytes + nb_bytes + alignment >= _this->size_of_each_array) {      /* Si la zone demandee est plus grosse que la granularitee */      /* On alloue un buffer plus gros que les autres */      _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * (_this->number_of_arrays+2));            _this->number_of_arrays += 1;      _this->consumed_in_last_array = prefix_bytes;            _this->arrays[_this->number_of_arrays - 1] = malloc(prefix_bytes + nb_bytes + alignment);      align_it(_this,alignment);      retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);      /* puis on repart sur un nouveau buffer vide */      _this->number_of_arrays += 1;      _this->consumed_in_last_array = 0;      _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);      return retval;    }    else {      _this->number_of_arrays += 1;      _this->consumed_in_last_array = prefix_bytes;      _this->arrays = (void**)realloc(_this->arrays, sizeof(void*) * _this->number_of_arrays);      _this->arrays[_this->number_of_arrays - 1] = malloc(_this->size_of_each_array);      align_it(_this,alignment);    }  }  retval = (void*)((char*)_this->arrays[_this->number_of_arrays - 1] + _this->consumed_in_last_array);  _this->consumed_in_last_array += nb_bytes;  return retval;}void *goom_heap_malloc_with_alignment(GoomHeap *_this, int nb_bytes, int alignment){  return goom_heap_malloc_with_alignment_prefixed(_this, nb_bytes, alignment, 0);}void *goom_heap_malloc(GoomHeap *_this, int nb_bytes){  return goom_heap_malloc_with_alignment(_this,nb_bytes,1);}

⌨️ 快捷键说明

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