| 46 | const char* Name; // for debug memory usage |
| 47 | protected: |
| 48 | void check_capacity(size_t len) { |
| 49 | if (Y_UNLIKELY(!last_free || len > last_free)) { |
| 50 | if (curseg != segs.end() && curseg->freepos > 0) { |
| 51 | ++curseg; |
| 52 | } |
| 53 | last_free = (len > segment_size ? len : segment_size); |
| 54 | if (curseg == segs.end() || curseg->_size < last_free) { |
| 55 | segs.push_back(seg_inf(seg_allocator.allocate(last_free), last_free)); |
| 56 | if (Y_UNLIKELY(Name)) { |
| 57 | printf("Pool \"%s\" was increased by %" PRISZT " bytes to %" PRISZT " Mb.\n", Name, last_free * sizeof(T), capacity() / 0x100000); |
| 58 | } |
| 59 | curseg = segs.end() - 1; |
| 60 | } |
| 61 | Y_ASSERT(curseg->freepos == 0); |
| 62 | Y_ASSERT(curseg->_size >= last_free); |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | public: |
| 67 | explicit segmented_pool(size_t segsz, const char* name = nullptr) |