Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
1.5 KiB

4 years ago
  1. // Pool memory allocator
  2. #ifndef __POOL_INCLUDED__
  3. #define __POOL_INCLUDED__
  4. #pragma warning(disable:4200)
  5. struct BLK { // block in an allocation pool
  6. CB cbFree;
  7. BYTE* pFree;
  8. BLK* pNext;
  9. BYTE buf[];
  10. BLK(CB cb) : cbFree(cb), pFree(buf), pNext(0) { }
  11. void* alloc(CB cb) {
  12. cb = cbAlign(cb); // Round up for alignment
  13. if (cb <= cbFree) {
  14. cbFree -= cb;
  15. BYTE* p = pFree;
  16. pFree += cb;
  17. return p;
  18. }
  19. return 0;
  20. }
  21. void flush() { cbFree = 0; }
  22. CB cb() { return pFree - buf; }
  23. };
  24. const CB cbPage = 0x1000;
  25. inline CB cbRoundUp(CB cb, CB cbMult) { return (cb + cbMult-1) & ~(cbMult-1); }
  26. inline void* __cdecl operator new(size_t size, CB cb) { return new char[size + cb]; }
  27. struct POOL { // allocation pool
  28. BLK* pHead;
  29. BLK* pTail;
  30. CB cbTotal;
  31. POOL() : pHead(new (0) BLK(0)), pTail(pHead), cbTotal(0) { }
  32. ~POOL() {
  33. BLK* pNext;
  34. for (BLK* pblk = pHead; pblk; pblk = pNext) {
  35. pNext = pblk->pNext;
  36. delete pblk;
  37. }
  38. }
  39. void* alloc(CB cb) {
  40. cb = cbAlign(cb); // Round up for alignment
  41. void* p = pTail->alloc(cb);
  42. if (!p) {
  43. CB cbAlloc = cbRoundUp(cb + cbPage, cbPage);
  44. if (pTail->pNext = new (cbAlloc) BLK(cbAlloc)) {
  45. pTail = pTail->pNext;
  46. p = pTail->alloc(cb);
  47. }
  48. }
  49. if (p)
  50. cbTotal += cb;
  51. return p;
  52. }
  53. void discard(CB cb) {
  54. cbTotal -= cb;
  55. }
  56. void blkFlush() { dassert(pTail); pTail->flush(); }
  57. CB cb() { return cbTotal; }
  58. private:
  59. POOL(const POOL&) { assert(0); } // error to copy a pool
  60. };
  61. inline void* __cdecl operator new(size_t size, POOL& pool) { return pool.alloc(size); }
  62. #endif // !__POOL_INCLUDED__