/* Bulk release. Implementations may override this method to handle the whole
* set at once. This could save e.g. unnecessary mutex dance. */
- virtual void release(const interval_set<uint64_t>& release_set) {
- /* TODO(rzarzynski): make this pure virtual and eradicate the single-op
- * release() after switching all allocators. */
- for (interval_set<uint64_t>::const_iterator p = release_set.begin();
- p != release_set.end();
- ++p) {
- release(p.get_start(), p.get_len());
- }
- }
+ virtual void release(const interval_set<uint64_t>& release_set) = 0;
virtual void dump() = 0;
insert_free(offset, length);
}
+void BitMapAllocator::release(
+ const interval_set<uint64_t>& release_set)
+{
+ for (interval_set<uint64_t>::const_iterator p = release_set.begin();
+ p != release_set.end();
+ ++p) {
+ const auto offset = p.get_start();
+ const auto length = p.get_len();
+ dout(10) << __func__ << " 0x"
+ << std::hex << offset << "~" << length << std::dec
+ << dendl;
+ insert_free(offset, length);
+ }
+}
+
uint64_t BitMapAllocator::get_free()
{
assert(m_bit_alloc->total_blocks() >= m_bit_alloc->get_used_blocks());
void release(
uint64_t offset, uint64_t length) override;
+ void release(
+ const interval_set<uint64_t>& release_set) override;
uint64_t get_free() override;