1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #include "bbmemory.h"
- #include <cstring>
- namespace{
- void *pools[32];
-
- unsigned char *poolBuf;
- size_t poolBufSize;
- }
- size_t bbMallocedBytes;
- void *bbMalloc( size_t size ){
- size=(size+sizeof( size_t )+7)&~7;
-
- void *p;
-
- if( size<256 ){
- if( pools[size>>3] ){
- p=pools[size>>3];
- pools[size>>3]=*(void**)p;
- }else{
- if( size>poolBufSize ){
- if( poolBufSize ){
- *(void**)poolBuf=pools[poolBufSize>>3];
- pools[poolBufSize>>3]=poolBuf;
- }
- poolBufSize=65536;
- poolBuf=(unsigned char*)::malloc( poolBufSize );
- }
- p=poolBuf;
- poolBuf+=size;
- poolBufSize-=size;
- }
- }else{
- p=::malloc( size );
- }
-
- bbMallocedBytes+=size;
- size_t *q=(size_t*)p;
- *q++=size;
- return q;
- }
- size_t bbMallocSize( void *p ){
- if( p ) return *((size_t*)p-1);
-
- return 0;
- }
- void bbFree( void *p ){
- if( !p ) return;
-
- size_t *q=(size_t*)p-1;
-
- size_t size=*q;
-
- bbMallocedBytes-=size;
- if( size<256 ){
- *(void**)q=pools[size>>3];
- pools[size>>3]=q;
- }else{
- ::free( q );
- }
- }
|