bbmemory.cpp 1011 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "bbmemory.h"
  2. #include <cstring>
  3. namespace{
  4. void *pools[32];
  5. unsigned char *poolBuf;
  6. size_t poolBufSize;
  7. }
  8. size_t bbMallocedBytes;
  9. void *bbMalloc( size_t size ){
  10. size=(size+sizeof( size_t )+7)&~7;
  11. void *p;
  12. if( size<256 ){
  13. if( pools[size>>3] ){
  14. p=pools[size>>3];
  15. pools[size>>3]=*(void**)p;
  16. }else{
  17. if( size>poolBufSize ){
  18. if( poolBufSize ){
  19. *(void**)poolBuf=pools[poolBufSize>>3];
  20. pools[poolBufSize>>3]=poolBuf;
  21. }
  22. poolBufSize=65536;
  23. poolBuf=(unsigned char*)::malloc( poolBufSize );
  24. }
  25. p=poolBuf;
  26. poolBuf+=size;
  27. poolBufSize-=size;
  28. }
  29. }else{
  30. p=::malloc( size );
  31. }
  32. bbMallocedBytes+=size;
  33. size_t *q=(size_t*)p;
  34. *q++=size;
  35. return q;
  36. }
  37. size_t bbMallocSize( void *p ){
  38. if( p ) return *((size_t*)p-1);
  39. return 0;
  40. }
  41. void bbFree( void *p ){
  42. if( !p ) return;
  43. size_t *q=(size_t*)p-1;
  44. size_t size=*q;
  45. bbMallocedBytes-=size;
  46. if( size<256 ){
  47. *(void**)q=pools[size>>3];
  48. pools[size>>3]=q;
  49. }else{
  50. ::free( q );
  51. }
  52. }