You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: process_vm.rs
    path of file: ./repos/occlum/src/libos/src/vm
    
    the code of the file until where you have to start completion: use super::*;

use super::chunk::*;
use super::user_space_vm::USER_SPACE_VM_MANAGER;
use super::vm_area::VMArea;
use super::vm_manager::MunmapChunkFlag;
use super::vm_perms::VMPerms;
use super::vm_util::{
    FileBacked, PagePolicy, VMInitializer, VMMapAddr, VMMapOptions, VMMapOptionsBuilder,
    VMRemapOptions,
};
use crate::config;
use crate::process::elf_file::{ElfFile, ProgramHeaderExt};
use crate::util::sync::rw_lock::RwLockWriteGuard;

use std::collections::HashSet;

// Used for heap and stack start address randomization.
const RANGE_FOR_RANDOMIZATION: usize = 256 * 4096; // 1M

#[derive(Debug, Clone)]
pub struct ProcessVMBuilder<'a, 'b> {
    elfs: Vec<&'b ElfFile<'a>>,
    heap_size: Option<usize>,
    stack_size: Option<usize>,
    mmap_size: Option<usize>,
}

impl<'a, 'b> ProcessVMBuilder<'a, 'b> {
    pub fn new(elfs: Vec<&'b ElfFile<'a>>) -> ProcessVMBuilder<'a, 'b> {
        Proce
    
    fn drop(&mut self) {
        let mut mem_chunks = self.mem_chunks.write().unwrap();
        // There are two cases when this drop is called:
        // (1) Process exits normally and in the end, drop process VM
        // (2) During creating process stage, process VM is ready but there are some other errors when creating the process, e.g. spawn_attribute is set
        // to a wrong value
        //
        // For the first case, the process VM is cleaned in the exit procedure and nothing is needed. For the second cases, mem_chunks is not empty and should
        // be cleaned here.
        mem_chunks
            .drain_filter(|chunk| chunk.is_single_vma())
            .for_each(|chunk| {
                USER_SPACE_VM_MANAGER.internal().munmap_chunk(
                    &chunk,
                    None,
                    MunmapChunkFlag::OnProcessExit,
                );
            });

        assert!(mem_chunks.len() == 0);
        info!("Process VM dropped");
    }