From 526400189847604e549fb88bec223689a40a6b8f Mon Sep 17 00:00:00 2001 From: "jochen@chromium.org" Date: Thu, 12 Jun 2014 17:06:24 +0000 Subject: [PATCH] Drop dependency on Isolate* from platform.h BUG=none R=dcarney@chromium.org LOG=n Review URL: https://codereview.chromium.org/328993003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21819 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/log.cc | 24 ++++++++---------------- src/log.h | 7 +++---- src/platform-cygwin.cc | 8 +++++--- src/platform-freebsd.cc | 8 +++++--- src/platform-linux.cc | 8 +++++--- src/platform-macos.cc | 8 +++++--- src/platform-openbsd.cc | 8 +++++--- src/platform-qnx.cc | 17 +++++++++-------- src/platform-solaris.cc | 3 ++- src/platform-win32.cc | 49 +++++++++++++++++++++++++++++++------------------ src/platform.h | 14 +++++++++++++- 11 files changed, 91 insertions(+), 63 deletions(-) diff --git a/src/log.cc b/src/log.cc index f6dfd21..05d8f7a 100644 --- a/src/log.cc +++ b/src/log.cc @@ -867,7 +867,12 @@ void Profiler::Engage() { if (engaged_) return; engaged_ = true; - OS::LogSharedLibraryAddresses(isolate_); + std::vector addresses = + OS::GetSharedLibraryAddresses(); + for (size_t i = 0; i < addresses.size(); ++i) { + LOG(isolate_, SharedLibraryEvent( + addresses[i].library_path, addresses[i].start, addresses[i].end)); + } // Start thread processing the profiler buffer. running_ = true; @@ -1048,26 +1053,13 @@ void Logger::ApiNamedSecurityCheck(Object* key) { } -void Logger::SharedLibraryEvent(const char* library_path, +void Logger::SharedLibraryEvent(const std::string& library_path, uintptr_t start, uintptr_t end) { if (!log_->IsEnabled() || !FLAG_prof) return; Log::MessageBuilder msg(log_); msg.Append("shared-library,\"%s\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n", - library_path, - start, - end); - msg.WriteToLogFile(); -} - - -void Logger::SharedLibraryEvent(const wchar_t* library_path, - uintptr_t start, - uintptr_t end) { - if (!log_->IsEnabled() || !FLAG_prof) return; - Log::MessageBuilder msg(log_); - msg.Append("shared-library,\"%ls\",0x%08" V8PRIxPTR ",0x%08" V8PRIxPTR "\n", - library_path, + library_path.c_str(), start, end); msg.WriteToLogFile(); diff --git a/src/log.h b/src/log.h index 68e0a6c..b4ad5f8 100644 --- a/src/log.h +++ b/src/log.h @@ -5,6 +5,8 @@ #ifndef V8_LOG_H_ #define V8_LOG_H_ +#include + #include "src/allocation.h" #include "src/objects.h" #include "src/platform.h" @@ -280,10 +282,7 @@ class Logger { void HeapSampleStats(const char* space, const char* kind, intptr_t capacity, intptr_t used); - void SharedLibraryEvent(const char* library_path, - uintptr_t start, - uintptr_t end); - void SharedLibraryEvent(const wchar_t* library_path, + void SharedLibraryEvent(const std::string& library_path, uintptr_t start, uintptr_t end); diff --git a/src/platform-cygwin.cc b/src/platform-cygwin.cc index 35c65c7..91235cf 100644 --- a/src/platform-cygwin.cc +++ b/src/platform-cygwin.cc @@ -106,12 +106,13 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; // This function assumes that the layout of the file is as follows: // hex_start_addr-hex_end_addr rwxp [binary_file_name] // If we encounter an unexpected situation we abort scanning further entries. FILE* fp = fopen("/proc/self/maps", "r"); - if (fp == NULL) return; + if (fp == NULL) return result; // Allocate enough room to be able to store a full file name. const int kLibNameLen = FILENAME_MAX + 1; @@ -150,7 +151,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { snprintf(lib_name, kLibNameLen, "%08" V8PRIxPTR "-%08" V8PRIxPTR, start, end); } - LOG(isolate, SharedLibraryEvent(lib_name, start, end)); + result.push_back(SharedLibraryAddress(lib_name, start, end)); } else { // Entry not describing executable data. Skip to end of line to set up // reading the next entry. @@ -162,6 +163,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { } free(lib_name); fclose(fp); + return result; } diff --git a/src/platform-freebsd.cc b/src/platform-freebsd.cc index ba59678..a1a0739 100644 --- a/src/platform-freebsd.cc +++ b/src/platform-freebsd.cc @@ -120,10 +120,11 @@ static unsigned StringToLong(char* buffer) { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; static const int MAP_LENGTH = 1024; int fd = open("/proc/self/maps", O_RDONLY); - if (fd < 0) return; + if (fd < 0) return result; while (true) { char addr_buffer[11]; addr_buffer[0] = '0'; @@ -154,9 +155,10 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { // There may be no filename in this line. Skip to next. if (start_of_path == NULL) continue; buffer[bytes_read] = 0; - LOG(isolate, SharedLibraryEvent(start_of_path, start, end)); + result.push_back(SharedLibraryAddress(start_of_path, start, end)); } close(fd); + return result; } diff --git a/src/platform-linux.cc b/src/platform-linux.cc index ee0b951..3cbf4da 100644 --- a/src/platform-linux.cc +++ b/src/platform-linux.cc @@ -182,12 +182,13 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; // This function assumes that the layout of the file is as follows: // hex_start_addr-hex_end_addr rwxp [binary_file_name] // If we encounter an unexpected situation we abort scanning further entries. FILE* fp = fopen("/proc/self/maps", "r"); - if (fp == NULL) return; + if (fp == NULL) return result; // Allocate enough room to be able to store a full file name. const int kLibNameLen = FILENAME_MAX + 1; @@ -227,7 +228,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { snprintf(lib_name, kLibNameLen, "%08" V8PRIxPTR "-%08" V8PRIxPTR, start, end); } - LOG(isolate, SharedLibraryEvent(lib_name, start, end)); + result.push_back(SharedLibraryAddress(lib_name, start, end)); } else { // Entry not describing executable data. Skip to end of line to set up // reading the next entry. @@ -239,6 +240,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { } free(lib_name); fclose(fp); + return result; } diff --git a/src/platform-macos.cc b/src/platform-macos.cc index 6535d27..4301875 100644 --- a/src/platform-macos.cc +++ b/src/platform-macos.cc @@ -125,7 +125,8 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; unsigned int images_count = _dyld_image_count(); for (unsigned int i = 0; i < images_count; ++i) { const mach_header* header = _dyld_get_image_header(i); @@ -144,9 +145,10 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { if (code_ptr == NULL) continue; const uintptr_t slide = _dyld_get_image_vmaddr_slide(i); const uintptr_t start = reinterpret_cast(code_ptr) + slide; - LOG(isolate, - SharedLibraryEvent(_dyld_get_image_name(i), start, start + size)); + result.push_back( + SharedLibraryAddress(_dyld_get_image_name(i), start, start + size)); } + return result; } diff --git a/src/platform-openbsd.cc b/src/platform-openbsd.cc index c0b5aae..1f8e239 100644 --- a/src/platform-openbsd.cc +++ b/src/platform-openbsd.cc @@ -113,12 +113,13 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; // This function assumes that the layout of the file is as follows: // hex_start_addr-hex_end_addr rwxp [binary_file_name] // If we encounter an unexpected situation we abort scanning further entries. FILE* fp = fopen("/proc/self/maps", "r"); - if (fp == NULL) return; + if (fp == NULL) return result; // Allocate enough room to be able to store a full file name. const int kLibNameLen = FILENAME_MAX + 1; @@ -157,7 +158,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { snprintf(lib_name, kLibNameLen, "%08" V8PRIxPTR "-%08" V8PRIxPTR, start, end); } - LOG(isolate, SharedLibraryEvent(lib_name, start, end)); + result.push_back(SharedLibraryAddress(lib_name, start, end)); } else { // Entry not describing executable data. Skip to end of line to set up // reading the next entry. @@ -169,6 +170,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { } free(lib_name); fclose(fp); + return result; } diff --git a/src/platform-qnx.cc b/src/platform-qnx.cc index 19ce885..3c95650 100644 --- a/src/platform-qnx.cc +++ b/src/platform-qnx.cc @@ -174,7 +174,8 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + std::vector result; procfs_mapinfo *mapinfos = NULL, *mapinfo; int proc_fd, num, i; @@ -188,20 +189,20 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { if ((proc_fd = open(buf, O_RDONLY)) == -1) { close(proc_fd); - return; + return result; } /* Get the number of map entries. */ if (devctl(proc_fd, DCMD_PROC_MAPINFO, NULL, 0, &num) != EOK) { close(proc_fd); - return; + return result; } mapinfos = reinterpret_cast( malloc(num * sizeof(procfs_mapinfo))); if (mapinfos == NULL) { close(proc_fd); - return; + return result; } /* Fill the map entries. */ @@ -209,7 +210,7 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { mapinfos, num * sizeof(procfs_mapinfo), &num) != EOK) { free(mapinfos); close(proc_fd); - return; + return result; } for (i = 0; i < num; i++) { @@ -219,13 +220,13 @@ void OS::LogSharedLibraryAddresses(Isolate* isolate) { if (devctl(proc_fd, DCMD_PROC_MAPDEBUG, &map, sizeof(map), 0) != EOK) { continue; } - LOG(isolate, SharedLibraryEvent(map.info.path, - mapinfo->vaddr, - mapinfo->vaddr + mapinfo->size)); + result.push_back(SharedLibraryAddress( + map.info.path, mapinfo->vaddr, mapinfo->vaddr + mapinfo->size)); } } free(mapinfos); close(proc_fd); + return result; } diff --git a/src/platform-solaris.cc b/src/platform-solaris.cc index fe1f9da..9ab6651 100644 --- a/src/platform-solaris.cc +++ b/src/platform-solaris.cc @@ -131,7 +131,8 @@ PosixMemoryMappedFile::~PosixMemoryMappedFile() { } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { + return std::vector(); } diff --git a/src/platform-win32.cc b/src/platform-win32.cc index 52888fe..b30aa24 100644 --- a/src/platform-win32.cc +++ b/src/platform-win32.cc @@ -1058,10 +1058,13 @@ TLHELP32_FUNCTION_LIST(DLL_FUNC_LOADED) // Load the symbols for generating stack traces. -static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { +static std::vector LoadSymbols( + HANDLE process_handle) { + static std::vector result; + static bool symbols_loaded = false; - if (symbols_loaded) return true; + if (symbols_loaded) return result; BOOL ok; @@ -1069,7 +1072,7 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { ok = _SymInitialize(process_handle, // hProcess NULL, // UserSearchPath false); // fInvadeProcess - if (!ok) return false; + if (!ok) return result; DWORD options = _SymGetOptions(); options |= SYMOPT_LOAD_LINES; @@ -1081,13 +1084,13 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { if (!ok) { int err = GetLastError(); PrintF("%d\n", err); - return false; + return result; } HANDLE snapshot = _CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, // dwFlags GetCurrentProcessId()); // th32ProcessId - if (snapshot == INVALID_HANDLE_VALUE) return false; + if (snapshot == INVALID_HANDLE_VALUE) return result; MODULEENTRY32W module_entry; module_entry.dwSize = sizeof(module_entry); // Set the size of the structure. BOOL cont = _Module32FirstW(snapshot, &module_entry); @@ -1105,31 +1108,37 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { if (base == 0) { int err = GetLastError(); if (err != ERROR_MOD_NOT_FOUND && - err != ERROR_INVALID_HANDLE) return false; + err != ERROR_INVALID_HANDLE) { + result.clear(); + return result; + } } - LOG(isolate, - SharedLibraryEvent( - module_entry.szExePath, - reinterpret_cast(module_entry.modBaseAddr), - reinterpret_cast(module_entry.modBaseAddr + - module_entry.modBaseSize))); + int lib_name_length = WideCharToMultiByte( + CP_UTF8, 0, module_entry.szExePath, -1, NULL, 0, NULL, NULL); + std::string lib_name(lib_name_length, 0); + WideCharToMultiByte(CP_UTF8, 0, module_entry.szExePath, -1, &lib_name[0], + lib_name_length, NULL, NULL); + result.push_back(OS::SharedLibraryAddress( + lib_name, reinterpret_cast(module_entry.modBaseAddr), + reinterpret_cast(module_entry.modBaseAddr + + module_entry.modBaseSize))); cont = _Module32NextW(snapshot, &module_entry); } CloseHandle(snapshot); symbols_loaded = true; - return true; + return result; } -void OS::LogSharedLibraryAddresses(Isolate* isolate) { +std::vector OS::GetSharedLibraryAddresses() { // SharedLibraryEvents are logged when loading symbol information. // Only the shared libraries loaded at the time of the call to - // LogSharedLibraryAddresses are logged. DLLs loaded after + // GetSharedLibraryAddresses are logged. DLLs loaded after // initialization are not accounted for. - if (!LoadDbgHelpAndTlHelp32()) return; + if (!LoadDbgHelpAndTlHelp32()) return std::vector(); HANDLE process_handle = GetCurrentProcess(); - LoadSymbols(isolate, process_handle); + return LoadSymbols(process_handle); } @@ -1150,7 +1159,11 @@ uint64_t OS::TotalPhysicalMemory() { #else // __MINGW32__ -void OS::LogSharedLibraryAddresses(Isolate* isolate) { } +std::vector OS::GetSharedLibraryAddresses() { + return std::vector(); +} + + void OS::SignalCodeMovingGC() { } #endif // __MINGW32__ diff --git a/src/platform.h b/src/platform.h index 3cec113..fbf6488 100644 --- a/src/platform.h +++ b/src/platform.h @@ -22,6 +22,8 @@ #define V8_PLATFORM_H_ #include +#include +#include #include "src/base/build_config.h" #include "src/platform/mutex.h" @@ -255,7 +257,17 @@ class OS { // Support for the profiler. Can do nothing, in which case ticks // occuring in shared libraries will not be properly accounted for. - static void LogSharedLibraryAddresses(Isolate* isolate); + struct SharedLibraryAddress { + SharedLibraryAddress( + const std::string& library_path, uintptr_t start, uintptr_t end) + : library_path(library_path), start(start), end(end) {} + + std::string library_path; + uintptr_t start; + uintptr_t end; + }; + + static std::vector GetSharedLibraryAddresses(); // Support for the profiler. Notifies the external profiling // process that a code moving garbage collection starts. Can do -- 2.7.4