audiohal: Make closing of effects and streams fast
There were two problems:
1. Joining of reader / writer / process threads (the threads that
interact with HAL) was taking up to 1 second because the thread
was usually waiting for an event flag to be toggled, or a 1s
timeout.
2. Calling IStream.close or IEffect.close shouldn't tax the caller.
Changed the code so a call to close only signals the thread that
it's time to exit, and then the thread is only joined in the
effect or stream destructor.
Bug: 34800063
Bug: 34499806
Test: see repro steps in the bugs
Change-Id: Ife20524a1eba4ec9a78152e89862526e8cd5c960
diff --git a/audio/2.0/default/StreamOut.cpp b/audio/2.0/default/StreamOut.cpp
index 1948b68..bfd592c 100644
--- a/audio/2.0/default/StreamOut.cpp
+++ b/audio/2.0/default/StreamOut.cpp
@@ -16,10 +16,12 @@
#define LOG_TAG "StreamOutHAL"
//#define LOG_NDEBUG 0
+#define ATRACE_TAG ATRACE_TAG_AUDIO
#include <android/log.h>
#include <hardware/audio.h>
#include <mediautils/SchedulingPolicyService.h>
+#include <utils/Trace.h>
#include "StreamOut.h"
@@ -121,7 +123,19 @@
}
StreamOut::~StreamOut() {
+ ATRACE_CALL();
close();
+ if (mWriteThread.get()) {
+ ATRACE_NAME("mWriteThread->join");
+ status_t status = mWriteThread->join();
+ ALOGE_IF(status, "write thread exit error: %s", strerror(-status));
+ }
+ if (mEfGroup) {
+ status_t status = EventFlag::deleteEventFlag(&mEfGroup);
+ ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status));
+ }
+ mCallback.clear();
+ mDevice->close_output_stream(mDevice, mStream);
mStream = nullptr;
mDevice = nullptr;
}
@@ -225,15 +239,10 @@
mIsClosed = true;
if (mWriteThread.get()) {
mStopWriteThread.store(true, std::memory_order_release);
- status_t status = mWriteThread->requestExitAndWait();
- ALOGE_IF(status, "write thread exit error: %s", strerror(-status));
}
if (mEfGroup) {
- status_t status = EventFlag::deleteEventFlag(&mEfGroup);
- ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status));
+ mEfGroup->wake(static_cast<uint32_t>(MessageQueueFlagBits::NOT_EMPTY));
}
- mCallback.clear();
- mDevice->close_output_stream(mDevice, mStream);
return Result::OK;
}