| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "crazy_linker_memory_mapping.h" |
| |
| namespace crazy { |
| |
| MemoryMapping::~MemoryMapping() { |
| Deallocate(); |
| } |
| |
| MemoryMapping& MemoryMapping::operator=(MemoryMapping&& other) noexcept { |
| if (this != &other) { |
| Deallocate(); |
| map_ = other.map_; |
| size_ = other.size_; |
| other.map_ = nullptr; |
| other.size_ = 0; |
| } |
| return *this; |
| } |
| |
| void MemoryMapping::Deallocate() { |
| if (map_) { |
| ::munmap(map_, size_); |
| map_ = nullptr; |
| size_ = 0; |
| } |
| } |
| |
| // static |
| MemoryMapping MemoryMapping::Create(void* address, |
| size_t size, |
| Protection prot, |
| int fd) { |
| int flags = (fd >= 0) ? MAP_SHARED : MAP_ANONYMOUS; |
| if (address) |
| flags |= MAP_FIXED; |
| |
| void* map = ::mmap(address, size, static_cast<int>(prot), flags, fd, 0); |
| if (map == MAP_FAILED) { |
| map = nullptr; |
| size = 0; |
| } |
| return {map, size}; |
| } |
| |
| } // namespace crazy |