diff options
author | 2017-06-02 14:26:06 -0700 | |
---|---|---|
committer | 2017-06-02 16:34:00 -0700 | |
commit | e59cb816470be6bc8129fa59b192109402f7b6ab (patch) | |
tree | 0af57b69e46aed57d4342dd7d98f9938f32e0064 | |
parent | 7bd73adeebf2b0952b275cde3cbb3acca68d47db (diff) |
ART: Rework monitor_android to use liblog helpers
Remove our custom writing. In preparation for different logging.
Bug: 62241642
Test: m
Test: m test-art-host
Test: Device boots
Test: Manual inspection of reports
Change-Id: I033767659da172b2c1aa8584d9a541fe43650f52
-rw-r--r-- | runtime/monitor_android.cc | 115 |
1 files changed, 49 insertions, 66 deletions
diff --git a/runtime/monitor_android.cc b/runtime/monitor_android.cc index a5978523e9..7ba36529fc 100644 --- a/runtime/monitor_android.cc +++ b/runtime/monitor_android.cc @@ -22,96 +22,79 @@ #include <sys/types.h> #include <log/log.h> +#include <log/log_event_list.h> #define EVENT_LOG_TAG_dvm_lock_sample 20003 namespace art { -static void Set4LE(uint8_t* buf, uint32_t val) { - *buf++ = (uint8_t)(val); - *buf++ = (uint8_t)(val >> 8); - *buf++ = (uint8_t)(val >> 16); - *buf = (uint8_t)(val >> 24); -} - -static char* EventLogWriteInt(char* dst, int value) { - *dst++ = EVENT_TYPE_INT; - Set4LE(reinterpret_cast<uint8_t*>(dst), value); - return dst + 4; -} - -static char* EventLogWriteString(char* dst, const char* value, size_t len) { - *dst++ = EVENT_TYPE_STRING; - len = len < 32 ? len : 32; - Set4LE(reinterpret_cast<uint8_t*>(dst), len); - dst += 4; - memcpy(dst, value, len); - return dst + len; -} - void Monitor::LogContentionEvent(Thread* self, uint32_t wait_ms, uint32_t sample_percent, ArtMethod* owner_method, uint32_t owner_dex_pc) { + android_log_event_list ctx(EVENT_LOG_TAG_dvm_lock_sample); + const char* owner_filename; int32_t owner_line_number; TranslateLocation(owner_method, owner_dex_pc, &owner_filename, &owner_line_number); - // Emit the event list length, 1 byte. - char eventBuffer[174]; - char* cp = eventBuffer; - *cp++ = 9; - // Emit the process name, <= 37 bytes. - int fd = open("/proc/self/cmdline", O_RDONLY); - char procName[33]; - memset(procName, 0, sizeof(procName)); - read(fd, procName, sizeof(procName) - 1); - close(fd); - size_t len = strlen(procName); - cp = EventLogWriteString(cp, procName, len); - - // Emit the sensitive thread ("main thread") status, 5 bytes. - cp = EventLogWriteInt(cp, Thread::IsSensitiveThread()); - - // Emit self thread name string, <= 37 bytes. - std::string thread_name; - self->GetThreadName(thread_name); - cp = EventLogWriteString(cp, thread_name.c_str(), thread_name.size()); - - // Emit the wait time, 5 bytes. - cp = EventLogWriteInt(cp, wait_ms); - - // Emit the source code file name, <= 37 bytes. - uint32_t pc; - ArtMethod* m = self->GetCurrentMethod(&pc); - const char* filename; - int32_t line_number; - TranslateLocation(m, pc, &filename, &line_number); - cp = EventLogWriteString(cp, filename, strlen(filename)); - - // Emit the source code line number, 5 bytes. - cp = EventLogWriteInt(cp, line_number); - - // Emit the lock owner source code file name, <= 37 bytes. + { + int fd = open("/proc/self/cmdline", O_RDONLY); + char procName[33]; + memset(procName, 0, sizeof(procName)); + read(fd, procName, sizeof(procName) - 1); + close(fd); + ctx << procName; + } + + // Emit the sensitive thread ("main thread") status. We follow tradition that this corresponds + // to a C++ bool's value, but be explicit. + constexpr uint32_t kIsSensitive = 1u; + constexpr uint32_t kIsNotSensitive = 0u; + ctx << (Thread::IsSensitiveThread() ? kIsSensitive : kIsNotSensitive); + + // Emit self thread name string. + { + std::string thread_name; + self->GetThreadName(thread_name); + ctx << thread_name; + } + + // Emit the wait time. + ctx << wait_ms; + + const char* filename = nullptr; + { + uint32_t pc; + ArtMethod* m = self->GetCurrentMethod(&pc); + int32_t line_number; + TranslateLocation(m, pc, &filename, &line_number); + + // Emit the source code file name. + ctx << filename; + + // Emit the source code line number. + ctx << line_number; + } + + // Emit the lock owner source code file name. if (owner_filename == nullptr) { owner_filename = ""; } else if (strcmp(filename, owner_filename) == 0) { // Common case, so save on log space. owner_filename = "-"; } - cp = EventLogWriteString(cp, owner_filename, strlen(owner_filename)); + ctx << owner_filename; - // Emit the source code line number, 5 bytes. - cp = EventLogWriteInt(cp, owner_line_number); + // Emit the source code line number. + ctx << owner_line_number; - // Emit the sample percentage, 5 bytes. - cp = EventLogWriteInt(cp, sample_percent); + // Emit the sample percentage. + ctx << sample_percent; - CHECK_LE((size_t)(cp - eventBuffer), sizeof(eventBuffer)); - android_btWriteLog(EVENT_LOG_TAG_dvm_lock_sample, EVENT_TYPE_LIST, eventBuffer, - (size_t)(cp - eventBuffer)); + ctx << LOG_ID_EVENTS; } } // namespace art |