Add some tracing for release fences
* Fix FenceMonitor to cleanly teardown
* App-side tracing for BBQ release callbacks
* Trace future compleition in TxnCallbackInvoker
Bug: 360932099
Bug: 357762453
Flag: EXEMPT debugging
Test: builds
Test: perfetto
Change-Id: I188c04da1e249b672b428837c328568d9e7a1e66
diff --git a/libs/gui/FenceMonitor.cpp b/libs/gui/FenceMonitor.cpp
index 230c81a..e38f1a8 100644
--- a/libs/gui/FenceMonitor.cpp
+++ b/libs/gui/FenceMonitor.cpp
@@ -25,9 +25,18 @@
namespace android::gui {
FenceMonitor::FenceMonitor(const char* name) : mName(name), mFencesQueued(0), mFencesSignaled(0) {
- std::thread thread(&FenceMonitor::loop, this);
- pthread_setname_np(thread.native_handle(), mName);
- thread.detach();
+ mThread = std::thread(&FenceMonitor::loop, this);
+}
+
+FenceMonitor::~FenceMonitor() {
+ {
+ std::lock_guard<std::mutex> lock(mMutex);
+ mStopped = true;
+ mCondition.notify_one();
+ }
+ if (mThread.joinable()) {
+ mThread.join();
+ }
}
void FenceMonitor::queueFence(const sp<Fence>& fence) {
@@ -35,24 +44,26 @@
std::lock_guard<std::mutex> lock(mMutex);
if (fence->getSignalTime() != Fence::SIGNAL_TIME_PENDING) {
- snprintf(message, sizeof(message), "%s fence %u has signaled", mName, mFencesQueued);
+ snprintf(message, sizeof(message), "%s fence %u has signaled", mName.c_str(),
+ mFencesQueued);
ATRACE_NAME(message);
// Need an increment on both to make the trace number correct.
mFencesQueued++;
mFencesSignaled++;
return;
}
- snprintf(message, sizeof(message), "Trace %s fence %u", mName, mFencesQueued);
+ snprintf(message, sizeof(message), "Trace %s fence %u", mName.c_str(), mFencesQueued);
ATRACE_NAME(message);
mQueue.push_back(fence);
mCondition.notify_one();
mFencesQueued++;
- ATRACE_INT(mName, int32_t(mQueue.size()));
+ ATRACE_INT(mName.c_str(), int32_t(mQueue.size()));
}
void FenceMonitor::loop() {
- while (true) {
+ pthread_setname_np(pthread_self(), mName.c_str());
+ while (!mStopped) {
threadLoop();
}
}
@@ -62,15 +73,18 @@
uint32_t fenceNum;
{
std::unique_lock<std::mutex> lock(mMutex);
- while (mQueue.empty()) {
+ while (mQueue.empty() && !mStopped) {
mCondition.wait(lock);
}
+ if (mStopped) {
+ return;
+ }
fence = mQueue[0];
fenceNum = mFencesSignaled;
}
{
char message[64];
- snprintf(message, sizeof(message), "waiting for %s %u", mName, fenceNum);
+ snprintf(message, sizeof(message), "waiting for %s %u", mName.c_str(), fenceNum);
ATRACE_NAME(message);
status_t result = fence->waitForever(message);
@@ -82,8 +96,8 @@
std::lock_guard<std::mutex> lock(mMutex);
mQueue.pop_front();
mFencesSignaled++;
- ATRACE_INT(mName, int32_t(mQueue.size()));
+ ATRACE_INT(mName.c_str(), int32_t(mQueue.size()));
}
}
-} // namespace android::gui
\ No newline at end of file
+} // namespace android::gui