diff options
Diffstat (limited to 'libc/bionic/bionic_systrace.cpp')
-rw-r--r-- | libc/bionic/bionic_systrace.cpp | 53 |
1 files changed, 23 insertions, 30 deletions
diff --git a/libc/bionic/bionic_systrace.cpp b/libc/bionic/bionic_systrace.cpp index 0de51c50a..fd9771298 100644 --- a/libc/bionic/bionic_systrace.cpp +++ b/libc/bionic/bionic_systrace.cpp @@ -14,50 +14,52 @@ * limitations under the License. */ -#include "private/bionic_systrace.h" - #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include "private/bionic_lock.h" +#include "private/bionic_systrace.h" +#include "private/CachedProperty.h" + #include <async_safe/log.h> #include <cutils/trace.h> // For ATRACE_TAG_BIONIC. -#include "private/CachedProperty.h" -#include "private/bionic_lock.h" - #define WRITE_OFFSET 32 static Lock g_lock; +static CachedProperty g_debug_atrace_tags_enableflags("debug.atrace.tags.enableflags"); +static uint64_t g_tags; +static int g_trace_marker_fd = -1; -bool should_trace(const uint64_t enable_tags) { - static uint64_t tags_val; - static CachedProperty tags_prop(kTraceTagsProp); +static bool should_trace() { g_lock.lock(); - if (tags_prop.DidChange()) { - tags_val = strtoull(tags_prop.Get(), nullptr, 0); + if (g_debug_atrace_tags_enableflags.DidChange()) { + g_tags = strtoull(g_debug_atrace_tags_enableflags.Get(), nullptr, 0); } g_lock.unlock(); - return tags_val & enable_tags; + return ((g_tags & ATRACE_TAG_BIONIC) != 0); } -int get_trace_marker_fd() { - static int opened_trace_marker_fd = -1; +static int get_trace_marker_fd() { g_lock.lock(); - if (opened_trace_marker_fd == -1) { - opened_trace_marker_fd = open("/sys/kernel/tracing/trace_marker", O_CLOEXEC | O_WRONLY); - if (opened_trace_marker_fd == -1) { - opened_trace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_CLOEXEC | O_WRONLY); + if (g_trace_marker_fd == -1) { + g_trace_marker_fd = open("/sys/kernel/tracing/trace_marker", O_CLOEXEC | O_WRONLY); + if (g_trace_marker_fd == -1) { + g_trace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_CLOEXEC | O_WRONLY); } } g_lock.unlock(); - return opened_trace_marker_fd; + return g_trace_marker_fd; } -// event could be 'B' for begin or 'E' for end. -void output_trace(const char* message, const char event) { +void bionic_trace_begin(const char* message) { + if (!should_trace()) { + return; + } + int trace_marker_fd = get_trace_marker_fd(); if (trace_marker_fd == -1) { return; @@ -67,22 +69,13 @@ void output_trace(const char* message, const char event) { // kernel trace_marker. int length = strlen(message); char buf[length + WRITE_OFFSET]; - size_t len = - async_safe_format_buffer(buf, length + WRITE_OFFSET, "%c|%d|%s", event, getpid(), message); + size_t len = async_safe_format_buffer(buf, length + WRITE_OFFSET, "B|%d|%s", getpid(), message); // Tracing may stop just after checking property and before writing the message. // So the write is acceptable to fail. See b/20666100. TEMP_FAILURE_RETRY(write(trace_marker_fd, buf, len)); } -void bionic_trace_begin(const char* message) { - if (!should_trace()) { - return; - } - - output_trace(message); -} - void bionic_trace_end() { if (!should_trace()) { return; |