| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Platform-specific code for MacOS goes here. For the POSIX-compatible | 5 // Platform-specific code for MacOS goes here. For the POSIX-compatible |
| 6 // parts, the implementation is in platform-posix.cc. | 6 // parts, the implementation is in platform-posix.cc. |
| 7 | 7 |
| 8 #include <dlfcn.h> | 8 #include <dlfcn.h> |
| 9 #include <mach/mach_init.h> | 9 #include <mach/mach_init.h> |
| 10 #include <mach-o/dyld.h> | 10 #include <mach-o/dyld.h> |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 prot, | 61 prot, |
| 62 MAP_PRIVATE | MAP_ANON, | 62 MAP_PRIVATE | MAP_ANON, |
| 63 kMmapFd, | 63 kMmapFd, |
| 64 kMmapFdOffset); | 64 kMmapFdOffset); |
| 65 if (mbase == MAP_FAILED) return NULL; | 65 if (mbase == MAP_FAILED) return NULL; |
| 66 *allocated = msize; | 66 *allocated = msize; |
| 67 return mbase; | 67 return mbase; |
| 68 } | 68 } |
| 69 | 69 |
| 70 | 70 |
| 71 class PosixMemoryMappedFile : public OS::MemoryMappedFile { | |
| 72 public: | |
| 73 PosixMemoryMappedFile(FILE* file, void* memory, int size) | |
| 74 : file_(file), memory_(memory), size_(size) { } | |
| 75 virtual ~PosixMemoryMappedFile(); | |
| 76 virtual void* memory() { return memory_; } | |
| 77 virtual int size() { return size_; } | |
| 78 private: | |
| 79 FILE* file_; | |
| 80 void* memory_; | |
| 81 int size_; | |
| 82 }; | |
| 83 | |
| 84 | |
| 85 OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) { | |
| 86 FILE* file = fopen(name, "r+"); | |
| 87 if (file == NULL) return NULL; | |
| 88 | |
| 89 fseek(file, 0, SEEK_END); | |
| 90 int size = ftell(file); | |
| 91 | |
| 92 void* memory = | |
| 93 mmap(OS::GetRandomMmapAddr(), | |
| 94 size, | |
| 95 PROT_READ | PROT_WRITE, | |
| 96 MAP_SHARED, | |
| 97 fileno(file), | |
| 98 0); | |
| 99 return new PosixMemoryMappedFile(file, memory, size); | |
| 100 } | |
| 101 | |
| 102 | |
| 103 OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size, | |
| 104 void* initial) { | |
| 105 FILE* file = fopen(name, "w+"); | |
| 106 if (file == NULL) return NULL; | |
| 107 int result = fwrite(initial, size, 1, file); | |
| 108 if (result < 1) { | |
| 109 fclose(file); | |
| 110 return NULL; | |
| 111 } | |
| 112 void* memory = | |
| 113 mmap(OS::GetRandomMmapAddr(), | |
| 114 size, | |
| 115 PROT_READ | PROT_WRITE, | |
| 116 MAP_SHARED, | |
| 117 fileno(file), | |
| 118 0); | |
| 119 return new PosixMemoryMappedFile(file, memory, size); | |
| 120 } | |
| 121 | |
| 122 | |
| 123 PosixMemoryMappedFile::~PosixMemoryMappedFile() { | |
| 124 if (memory_) OS::Free(memory_, size_); | |
| 125 fclose(file_); | |
| 126 } | |
| 127 | |
| 128 | |
| 129 std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { | 71 std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { |
| 130 std::vector<SharedLibraryAddress> result; | 72 std::vector<SharedLibraryAddress> result; |
| 131 unsigned int images_count = _dyld_image_count(); | 73 unsigned int images_count = _dyld_image_count(); |
| 132 for (unsigned int i = 0; i < images_count; ++i) { | 74 for (unsigned int i = 0; i < images_count; ++i) { |
| 133 const mach_header* header = _dyld_get_image_header(i); | 75 const mach_header* header = _dyld_get_image_header(i); |
| 134 if (header == NULL) continue; | 76 if (header == NULL) continue; |
| 135 #if V8_HOST_ARCH_X64 | 77 #if V8_HOST_ARCH_X64 |
| 136 uint64_t size; | 78 uint64_t size; |
| 137 char* code_ptr = getsectdatafromheader_64( | 79 char* code_ptr = getsectdatafromheader_64( |
| 138 reinterpret_cast<const mach_header_64*>(header), | 80 reinterpret_cast<const mach_header_64*>(header), |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 bool VirtualMemory::ReleaseRegion(void* address, size_t size) { | 243 bool VirtualMemory::ReleaseRegion(void* address, size_t size) { |
| 302 return munmap(address, size) == 0; | 244 return munmap(address, size) == 0; |
| 303 } | 245 } |
| 304 | 246 |
| 305 | 247 |
| 306 bool VirtualMemory::HasLazyCommits() { | 248 bool VirtualMemory::HasLazyCommits() { |
| 307 return false; | 249 return false; |
| 308 } | 250 } |
| 309 | 251 |
| 310 } } // namespace v8::base | 252 } } // namespace v8::base |
| OLD | NEW |