EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

SAlloc.c (1337B)


      1 #include <stdlib.h>
      2 #include <EGong/Util/SAlloc.h>
      3 #include <EGong/Util/Log.h>
      4 
      5 void SAlloc_init(struct SAlloc *salloc, size_t chunk){
      6 	if(chunk==0){
      7 		salloc->chunk_size=EGONG_SALLOC_DEFAULT_CHUNK;
      8 	}
      9 	else{
     10 		salloc->chunk_size=chunk;
     11 	}
     12 	salloc->m_allocd=salloc->s_allocd=0;
     13 	salloc->data=NULL;
     14 }
     15 
     16 void *SAlloc_alloc(struct SAlloc *salloc, size_t size){
     17 	salloc->s_allocd+=size;
     18 	while(salloc->s_allocd>salloc->m_allocd){
     19 		salloc->m_allocd+=salloc->chunk_size;
     20 	}
     21 	salloc->data=realloc(salloc->data, salloc->chunk_size);
     22 	if(salloc->data==NULL){
     23 		do_log("Couldn't allocate memory", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR);
     24 		return NULL;
     25 	}
     26 	return (void *)((intptr_t)salloc->data+(intptr_t)(salloc->s_allocd-size));
     27 }
     28 int SAlloc_rewind(struct SAlloc *salloc, size_t size){
     29 	if(size>=salloc->m_allocd){
     30 		do_log("Trying to rewind out of boundary", LOG_TYPE_NORMAL, LOG_LEVEL_WARNING);
     31 		SAlloc_destroy(salloc);
     32 		SAlloc_init(salloc, salloc->chunk_size);
     33 	}
     34 	salloc->s_allocd-=size;
     35 	while(salloc->s_allocd<salloc->m_allocd-salloc->chunk_size){
     36 		salloc->m_allocd-=salloc->chunk_size;
     37 	}
     38 	salloc->data=realloc(salloc->data, salloc->chunk_size);
     39 	if(salloc->data==NULL){
     40 		do_log("Couldn't allocate memory", LOG_TYPE_SIGNAL, LOG_LEVEL_ERROR);
     41 		return -1;
     42 	}
     43 	return 0;
     44 }
     45 void *SAlloc_destroy(struct SAlloc *salloc){
     46 	free(salloc->data);
     47 }