Пример #1
0
std::error_code
SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup,
        unsigned Permissions) {
    for (sys::MemoryBlock &MB : MemGroup.PendingMem)
        if (std::error_code EC = sys::Memory::protectMappedMemory(MB, Permissions))
            return EC;

    MemGroup.PendingMem.clear();

    // Now go through free blocks and trim any of them that don't span the entire
    // page because one of the pending blocks may have overlapped it.
    for (FreeMemBlock &FreeMB : MemGroup.FreeMem) {
        FreeMB.Free = trimBlockToPageSize(FreeMB.Free);
        // We cleared the PendingMem list, so all these pointers are now invalid
        FreeMB.PendingPrefixIndex = (unsigned)-1;
    }

    // Remove all blocks which are now empty
    MemGroup.FreeMem.erase(
        std::remove_if(MemGroup.FreeMem.begin(), MemGroup.FreeMem.end(),
    [](FreeMemBlock &FreeMB) {
        return FreeMB.Free.size() == 0;
    }),
    MemGroup.FreeMem.end());

    return std::error_code();
}
Пример #2
0
llvm_error_code PystonMemoryManager::applyMemoryGroupPermissions(MemoryGroup& MemGroup, unsigned Permissions) {

    for (sys::MemoryBlock& MB : MemGroup.PendingMem) {
        llvm_error_code ec;
        ec = sys::Memory::protectMappedMemory(MB, Permissions);
        if (ec) {
            return ec;
        }
    }
    MemGroup.PendingMem.clear();

    // Now go through free blocks and trim any of them that don't span the entire
    // page because one of the pending blocks may have overlapped it.
    for (FreeMemBlock& FreeMB : MemGroup.FreeMem) {
        FreeMB.Free = trimBlockToPageSize(FreeMB.Free);
        // We cleared the PendingMem list, so all these pointers are now invalid
        FreeMB.PendingPrefixIndex = (unsigned)-1;
    }

    // Remove all blocks which are now empty
    MemGroup.FreeMem.erase(remove_if(MemGroup.FreeMem, [](FreeMemBlock& FreeMB) { return FreeMB.Free.size() == 0; }),
                           MemGroup.FreeMem.end());

#if LLVMREV < 209952
    return llvm_error_code::success();
#else
    return llvm_error_code();
#endif
}