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(); }
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 }