| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 fclose(file); | 470 fclose(file); |
| 471 return NULL; | 471 return NULL; |
| 472 } | 472 } |
| 473 void* memory = | 473 void* memory = |
| 474 mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fileno(file), 0); | 474 mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fileno(file), 0); |
| 475 return new PosixMemoryMappedFile(file, memory, size); | 475 return new PosixMemoryMappedFile(file, memory, size); |
| 476 } | 476 } |
| 477 | 477 |
| 478 | 478 |
| 479 PosixMemoryMappedFile::~PosixMemoryMappedFile() { | 479 PosixMemoryMappedFile::~PosixMemoryMappedFile() { |
| 480 if (memory_) munmap(memory_, size_); | 480 if (memory_) OS::Free(memory_, size_); |
| 481 fclose(file_); | 481 fclose(file_); |
| 482 } | 482 } |
| 483 | 483 |
| 484 | 484 |
| 485 void OS::LogSharedLibraryAddresses() { | 485 void OS::LogSharedLibraryAddresses() { |
| 486 // This function assumes that the layout of the file is as follows: | 486 // This function assumes that the layout of the file is as follows: |
| 487 // hex_start_addr-hex_end_addr rwxp <unused data> [binary_file_name] | 487 // hex_start_addr-hex_end_addr rwxp <unused data> [binary_file_name] |
| 488 // If we encounter an unexpected situation we abort scanning further entries. | 488 // If we encounter an unexpected situation we abort scanning further entries. |
| 489 FILE* fp = fopen("/proc/self/maps", "r"); | 489 FILE* fp = fopen("/proc/self/maps", "r"); |
| 490 if (fp == NULL) return; | 490 if (fp == NULL) return; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 552 // PROT_EXEC so that analysis tools can properly attribute ticks. We | 552 // PROT_EXEC so that analysis tools can properly attribute ticks. We |
| 553 // do a mmap with a name known by ll_prof.py and immediately munmap | 553 // do a mmap with a name known by ll_prof.py and immediately munmap |
| 554 // it. This injects a GC marker into the stream of events generated | 554 // it. This injects a GC marker into the stream of events generated |
| 555 // by the kernel and allows us to synchronize V8 code log and the | 555 // by the kernel and allows us to synchronize V8 code log and the |
| 556 // kernel log. | 556 // kernel log. |
| 557 int size = sysconf(_SC_PAGESIZE); | 557 int size = sysconf(_SC_PAGESIZE); |
| 558 FILE* f = fopen(kGCFakeMmap, "w+"); | 558 FILE* f = fopen(kGCFakeMmap, "w+"); |
| 559 void* addr = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_PRIVATE, | 559 void* addr = mmap(NULL, size, PROT_READ | PROT_EXEC, MAP_PRIVATE, |
| 560 fileno(f), 0); | 560 fileno(f), 0); |
| 561 ASSERT(addr != MAP_FAILED); | 561 ASSERT(addr != MAP_FAILED); |
| 562 munmap(addr, size); | 562 OS::Free(addr, size); |
| 563 fclose(f); | 563 fclose(f); |
| 564 } | 564 } |
| 565 | 565 |
| 566 | 566 |
| 567 int OS::StackWalk(Vector<OS::StackFrame> frames) { | 567 int OS::StackWalk(Vector<OS::StackFrame> frames) { |
| 568 // backtrace is a glibc extension. | 568 // backtrace is a glibc extension. |
| 569 #ifdef __GLIBC__ | 569 #ifdef __GLIBC__ |
| 570 int frames_size = frames.length(); | 570 int frames_size = frames.length(); |
| 571 ScopedVector<void*> addresses(frames_size); | 571 ScopedVector<void*> addresses(frames_size); |
| 572 | 572 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 ASSERT(IsAligned(alignment, static_cast<intptr_t>(OS::AllocateAlignment()))); | 614 ASSERT(IsAligned(alignment, static_cast<intptr_t>(OS::AllocateAlignment()))); |
| 615 size_t request_size = RoundUp(size + alignment, | 615 size_t request_size = RoundUp(size + alignment, |
| 616 static_cast<intptr_t>(OS::AllocateAlignment())); | 616 static_cast<intptr_t>(OS::AllocateAlignment())); |
| 617 void* reservation = mmap(GetRandomMmapAddr(), | 617 void* reservation = mmap(GetRandomMmapAddr(), |
| 618 request_size, | 618 request_size, |
| 619 PROT_NONE, | 619 PROT_NONE, |
| 620 MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, | 620 MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, |
| 621 kMmapFd, | 621 kMmapFd, |
| 622 kMmapFdOffset); | 622 kMmapFdOffset); |
| 623 if (reservation == MAP_FAILED) return; | 623 if (reservation == MAP_FAILED) return; |
| 624 |
| 624 Address base = static_cast<Address>(reservation); | 625 Address base = static_cast<Address>(reservation); |
| 625 Address aligned_base = RoundUp(base, alignment); | 626 Address aligned_base = RoundUp(base, alignment); |
| 626 ASSERT(base <= aligned_base); | 627 ASSERT_LE(base, aligned_base); |
| 627 | 628 |
| 628 // Unmap extra memory reserved before and after the desired block. | 629 // Unmap extra memory reserved before and after the desired block. |
| 629 size_t bytes_prior = static_cast<size_t>(aligned_base - base); | 630 if (aligned_base != base) { |
| 630 if (bytes_prior > 0) { | 631 size_t prefix_size = static_cast<size_t>(aligned_base - base); |
| 631 munmap(base, bytes_prior); | 632 OS::Free(base, prefix_size); |
| 632 } | 633 request_size -= prefix_size; |
| 633 if (static_cast<size_t>(aligned_base - base) < request_size - size) { | |
| 634 munmap(aligned_base + size, request_size - size - bytes_prior); | |
| 635 } | 634 } |
| 636 | 635 |
| 636 size_t aligned_size = RoundUp(size, OS::AllocateAlignment()); |
| 637 ASSERT_LE(aligned_size, request_size); |
| 638 |
| 639 if (aligned_size != request_size) { |
| 640 size_t suffix_size = request_size - aligned_size; |
| 641 OS::Free(aligned_base + aligned_size, suffix_size); |
| 642 request_size -= suffix_size; |
| 643 } |
| 644 |
| 645 ASSERT(aligned_size == request_size); |
| 646 |
| 637 address_ = static_cast<void*>(aligned_base); | 647 address_ = static_cast<void*>(aligned_base); |
| 638 size_ = size; | 648 size_ = aligned_size; |
| 639 } | 649 } |
| 640 | 650 |
| 641 | 651 |
| 642 VirtualMemory::~VirtualMemory() { | 652 VirtualMemory::~VirtualMemory() { |
| 643 if (IsReserved()) { | 653 if (IsReserved()) { |
| 644 bool result = ReleaseRegion(address(), size()); | 654 bool result = ReleaseRegion(address(), size()); |
| 645 ASSERT(result); | 655 ASSERT(result); |
| 646 USE(result); | 656 USE(result); |
| 647 } | 657 } |
| 648 } | 658 } |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1212 | 1222 |
| 1213 | 1223 |
| 1214 void Sampler::Stop() { | 1224 void Sampler::Stop() { |
| 1215 ASSERT(IsActive()); | 1225 ASSERT(IsActive()); |
| 1216 SignalSender::RemoveActiveSampler(this); | 1226 SignalSender::RemoveActiveSampler(this); |
| 1217 SetActive(false); | 1227 SetActive(false); |
| 1218 } | 1228 } |
| 1219 | 1229 |
| 1220 | 1230 |
| 1221 } } // namespace v8::internal | 1231 } } // namespace v8::internal |
| OLD | NEW |