void try_merge_buddy_recursive( ChunkMap::iterator cmit ) { // compute address of buddy intptr_t address = cmit->second.address; intptr_t buddy_address = (address ^ cmit->second.size); DVLOG(5) << cmit->second << " buddy address " << (void *) buddy_address; // does it exist? ChunkMap::iterator buddy_iterator = chunks_.find( buddy_address ); if( buddy_iterator != chunks_.end() && buddy_iterator->second.size == cmit->second.size && buddy_iterator->second.in_use == false ) { DVLOG(5) << "buddy found! address " << (void *) address << " buddy address " << (void *) buddy_address; // remove the higher-addressed chunk ChunkMap::iterator higher_iterator = address < buddy_address ? buddy_iterator : cmit; remove_from_free_list( higher_iterator ); chunks_.erase( higher_iterator ); // keep the the lower-addressed chunk in the map: // update its size and move it to the right free list ChunkMap::iterator lower_iterator = address < buddy_address ? cmit : buddy_iterator; remove_from_free_list( lower_iterator ); // should these be swapped? I think so. lower_iterator->second.size *= 2; add_to_free_list( lower_iterator ); // see if we have more to merge try_merge_buddy_recursive( lower_iterator ); } }