* BitMapArea Leaf and Internal
*/
BitMapAreaIN::BitMapAreaIN(CephContext* cct)
- : BitMapArea(cct), m_child_list(nullptr)
+ : BitMapArea(cct)
{
// nothing
}
} else {
children.push_back(new BitMapAreaIN(cct, total_blocks, i, def));
}
- BitMapAreaList *list = new BitMapAreaList(std::move(children));
- m_child_list = list;
+ m_child_list = BitMapAreaList(std::move(children));
m_num_child = num_child;
}
}
while (num_blocks) {
- area = (BitMapArea *) m_child_list->get_nth_item(
+ area = (BitMapArea *) m_child_list.get_nth_item(
start_block / m_child_size_blocks);
area_block_offset = start_block % m_child_size_blocks;
int64_t blk_off = 0;
BmapEntityListIter iter = BmapEntityListIter(
- m_child_list, hint / m_child_size_blocks, wrap);
+ &m_child_list, hint / m_child_size_blocks, wrap);
while ((child = (BitMapArea *) iter.next())) {
if (!child_check_n_lock(child, 1)) {
alloc_assert(start_block >= 0);
while (blks) {
- child = (BitMapArea *) m_child_list->get_nth_item(
+ child = (BitMapArea *) m_child_list.get_nth_item(
start_blk / m_child_size_blocks);
child_block_offset = start_blk % child->size();
}
while (num_blocks) {
- child = (BitMapArea *) m_child_list->get_nth_item(
+ child = (BitMapArea *) m_child_list.get_nth_item(
start_block / m_child_size_blocks);
child_block_offset = start_block % m_child_size_blocks;
BitMapArea *child = NULL;
BmapEntityListIter iter = BmapEntityListIter(
- m_child_list, 0, false);
+ &m_child_list, 0, false);
while ((child = (BitMapArea *) iter.next())) {
child->dump_state(cct, count);
children.emplace_back(new BitMapZone(cct, m_child_size_blocks, i, def));
}
- BitMapAreaList *list = new BitMapAreaList(std::move(children));
-
- m_child_list = list;
+ m_child_list = BitMapAreaList(std::move(children));
m_num_child = num_child;
BitMapAreaLeaf::incr_count();
{
lock_excl();
- BitMapAreaList *list = m_child_list;
- for (int64_t i = 0; i < list->size(); i++) {
- BitMapArea *child = (BitMapArea *) list->get_nth_item(i);
+ for (int64_t i = 0; i < m_child_list.size(); i++) {
+ BitMapArea *child = (BitMapArea *) m_child_list.get_nth_item(i);
delete child;
}
- delete list;
-
unlock();
}
int64_t blk_off = 0;
BmapEntityListIter iter = BmapEntityListIter(
- m_child_list, hint / m_child_size_blocks, false);
+ &m_child_list, hint / m_child_size_blocks, false);
/* We're sure the only element type we aggregate is BitMapZone,
* so there is no business to go through vptr and thus prohibit
}
while (num_blocks) {
- child = (BitMapArea *) m_child_list->get_nth_item(
+ child = (BitMapArea *) m_child_list.get_nth_item(
start_block / m_child_size_blocks);
child_block_offset = start_block % m_child_size_blocks;
{
lock_excl();
- BitMapAreaList *list = m_child_list;
- for (int64_t i = 0; i < list->size(); i++) {
- BitMapArea *child = (BitMapArea *) list->get_nth_item(i);
+ for (int64_t i = 0; i < m_child_list.size(); i++) {
+ BitMapArea *child = (BitMapArea *) m_child_list.get_nth_item(i);
delete child;
}
- delete list;
-
unlock();
pthread_rwlock_destroy(&m_rw_lock);
}
std::vector<BitMapArea*> m_items;
public:
+ /* Must be DefaultConstructible as BitMapAreaIN and derivates employ
+ * a deferred init, sorry. */
+ BitMapAreaList() = default;
+
BitMapAreaList(std::vector<BitMapArea*>&& m_items)
: m_items(std::move(m_items)) {
}
int64_t m_used_blocks;
int64_t m_reserved_blocks;
std::mutex m_blocks_lock;
- BitMapAreaList *m_child_list;
+ BitMapAreaList m_child_list;
bool is_allocated(int64_t start_block, int64_t num_blocks) override;
bool is_exhausted() override;