#ifndef X_memory_h#defineX_memory_h#include<stdlib.h>#include<stdio.h>#include<memory.h>typedefenum{errorunknown, noerror, Errorinit}xmemerrorcode; #ifdef __cplusplusextern "C" {#endif intInitmemory (intsize); void* XMALLOC (intsize); voidXfree (void*data); #ifdef __cplusplus}#endif#endif
#include"Xmemory.h"typedefstruct { void*Pre; void*Next; intsize;} Stblock;Staticstblock* head =NULL;intInitmemory (intsize) {Stblock* Tail =NULL; Char* Memhead = (Char*)malloc(size); if(NULL = =memhead)returnErrorinit; memset (Memhead,0, size); Head= (stblock*) Memhead; Head->pre =NULL; Head->next = memhead + Size-sizeof(Stblock); Head->size =0; Tail= head->Next; Tail->pre =Head; Tail->next =NULL; Tail->size =0; returnNoError;}void* XMALLOC (intsize) {Stblock* Blk =Head; Stblock* Nblk =NULL; Stblock* Tmpblk =NULL; Char* ret =NULL; intNtry =1; Do { intValidsize = (Char*) Blk->next-(Char*) Blk-sizeof(stblock) *2-Blk->size; if(Validsize >=size) {nblk= (stblock*) ((Char*) blk+sizeof(Stblock) +blk->size); Nblk->size =size; Nblk->next = blk->Next; Nblk->pre =Blk; Blk->next =nblk; Break; }Else{BLK= blk->Next; } } while(blk->next); if(NULL = =nblk) { returnNULL; } ret= (Char*) nblk+sizeof(Stblock); memset (ret,0, size); returnret;}voidXfree (void*data) {Stblock* Blk =Head; Stblock* Preblk =NULL; Do { if((Char*) blk+sizeof(stblock) = =data) {preblk= blk->Pre; Preblk->next = blk->Next; Break; }Else{BLK= blk->Next; } } while(blk);}
Memory Pool simplified version C language