112 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "mystdlib.h"
 | |
| #include "string.h"
 | |
| #include "exception.h"
 | |
| #include "stdio.h"
 | |
| #include "debug.h"
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| static void __mem_append_m(map_def** m , void* p);
 | |
| 
 | |
| 
 | |
| void __mem_clear(map_def **m){
 | |
|   if(!(*m)){
 | |
|     return;
 | |
|   }
 | |
|   size_t *map=(*m)->mem_map;
 | |
|   size_t size=(*m)->map_size;
 | |
|   for(size_t i=0;i<size;i++){
 | |
|     if(map[i]){
 | |
|       free((void *)map[i]);
 | |
|       DBG_INFO("clear eme_p=%08lx\n",map[i]);
 | |
|     }
 | |
|   }
 | |
|   free(*m);
 | |
|   *m=0;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void __mem_mov(map_def **d,map_def **s){
 | |
|   if(!(*s)){
 | |
|     return;
 | |
|   }
 | |
|   size_t *map=(*s)->mem_map;
 | |
|   for(size_t i=0;i<(*s)->map_size;i++){
 | |
|     if(map[i]){
 | |
|       __mem_append_m(d,(void *)map[i]);
 | |
|     }
 | |
|   }
 | |
|   free(*s);
 | |
|   (*s)=0;
 | |
|   DBG_INFO("mem mov end.\n");
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| void mem_free(void *p){
 | |
|   exception_def *th=exception();
 | |
|   map_def **m=&th->jmp_head->mem;
 | |
|   if(*m){
 | |
|     for(size_t i=0;i<(*m)->map_size;i++){
 | |
|       if((*m)->mem_map[i]==(size_t)p){
 | |
|         (*m)->mem_map[i]=0;
 | |
|         DBG_INFO("free eme_p=%08lx\n",(size_t)p);
 | |
|         (*m)->mam_used--;
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   free(p);
 | |
| }
 | |
| 
 | |
| static void __mem_append_m(map_def **m,void *p){
 | |
|   if(!(*m)){
 | |
|     (*m)=calloc(sizeof(map_def)+MAP_SIZE_STEP*sizeof(size_t),1);
 | |
|     (*m)->map_size=MAP_SIZE_STEP;
 | |
|   }
 | |
|   if((*m)->mam_used>=(*m)->map_size){
 | |
|     map_def *mt=*m;
 | |
|     *m=calloc(sizeof(map_def)+((*m)->map_size+ MAP_SIZE_STEP)*sizeof(size_t),1);
 | |
|     (*m)->mam_used=mt->mam_used;
 | |
|     (*m)->map_size=mt->map_size+MAP_SIZE_STEP;
 | |
|     memcpy((*m)->mem_map,mt->mem_map,mt->map_size*sizeof(size_t));
 | |
|     free(mt);
 | |
|   }
 | |
|   if((*m)->mam_used<(*m)->map_size){
 | |
|     for(size_t i=0;i<(*m)->map_size;i++){
 | |
|       if((*m)->mem_map[i]==0){
 | |
|         (*m)->mem_map[i]=(size_t)p;
 | |
|         DBG_INFO("append eme_p=%08lx\n",(size_t)p);
 | |
|         (*m)->mam_used++;
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void __mem_append(void *p){
 | |
|   exception_def *th=exception();
 | |
|   map_def **m=&th->jmp_head->mem;
 | |
|   __mem_append_m(m,p);
 | |
| }
 | |
| 
 | |
| void *mem_malloc(size_t size){
 | |
|   void *p=malloc(size);
 | |
|   __mem_append(p);
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| void *mem_calloc(size_t memb_num, size_t memb_size){
 | |
|   void *p=calloc(memb_num, memb_size);
 | |
|   __mem_append(p);
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | 
