fdtrack: make actually async safe.
Test: setprop persist.sys.debug.fdtrack_enable_threshold; stop; start; logcat -c; killall -39 system_server; logcat -d | grep fdtrack
Change-Id: Id9baa54af9e5cfb6e1ee1026f71d7fb41b7c3ad0
diff --git a/libfdtrack/fdtrack.cpp b/libfdtrack/fdtrack.cpp
index 0b9963f..9506751 100644
--- a/libfdtrack/fdtrack.cpp
+++ b/libfdtrack/fdtrack.cpp
@@ -110,7 +110,11 @@
continue;
}
- std::lock_guard<std::mutex> lock(entry->mutex);
+ if (!entry->mutex.try_lock()) {
+ async_safe_format_log(ANDROID_LOG_WARN, "fdtrack", "fd %d locked, skipping", fd);
+ continue;
+ }
+
if (entry->backtrace.empty()) {
continue;
}
@@ -122,6 +126,8 @@
async_safe_format_log(ANDROID_LOG_INFO, "fdtrack", " %zu: %s+%" PRIu64, i - frame_skip,
frame.function_name.c_str(), frame.function_offset);
}
+
+ entry->mutex.unlock();
}
android_fdtrack_set_enabled(prev);
}