MemoryPool.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // MemoryPool.cpp
  3. //
  4. // $Id: //poco/1.4/Foundation/src/MemoryPool.cpp#1 $
  5. //
  6. // Library: Foundation
  7. // Package: Core
  8. // Module: MemoryPool
  9. //
  10. // Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
  11. // and Contributors.
  12. //
  13. // SPDX-License-Identifier: BSL-1.0
  14. //
  15. #include "Poco/MemoryPool.h"
  16. #include "Poco/Exception.h"
  17. namespace Poco {
  18. MemoryPool::MemoryPool(std::size_t blockSize, int preAlloc, int maxAlloc):
  19. _blockSize(blockSize),
  20. _maxAlloc(maxAlloc),
  21. _allocated(preAlloc)
  22. {
  23. poco_assert (maxAlloc == 0 || maxAlloc >= preAlloc);
  24. poco_assert (preAlloc >= 0 && maxAlloc >= 0);
  25. int r = BLOCK_RESERVE;
  26. if (preAlloc > r)
  27. r = preAlloc;
  28. if (maxAlloc > 0 && maxAlloc < r)
  29. r = maxAlloc;
  30. _blocks.reserve(r);
  31. for (int i = 0; i < preAlloc; ++i)
  32. {
  33. _blocks.push_back(new char[_blockSize]);
  34. }
  35. }
  36. MemoryPool::~MemoryPool()
  37. {
  38. for (BlockVec::iterator it = _blocks.begin(); it != _blocks.end(); ++it)
  39. {
  40. delete [] *it;
  41. }
  42. }
  43. void* MemoryPool::get()
  44. {
  45. FastMutex::ScopedLock lock(_mutex);
  46. if (_blocks.empty())
  47. {
  48. if (_maxAlloc == 0 || _allocated < _maxAlloc)
  49. {
  50. ++_allocated;
  51. return new char[_blockSize];
  52. }
  53. else throw OutOfMemoryException("MemoryPool exhausted");
  54. }
  55. else
  56. {
  57. char* ptr = _blocks.back();
  58. _blocks.pop_back();
  59. return ptr;
  60. }
  61. }
  62. void MemoryPool::release(void* ptr)
  63. {
  64. FastMutex::ScopedLock lock(_mutex);
  65. _blocks.push_back(reinterpret_cast<char*>(ptr));
  66. }
  67. } // namespace Poco