diff options
author | alk3pInjection <webmaster@raspii.tech> | 2021-10-12 16:30:00 +0800 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2021-10-12 16:30:00 +0800 |
commit | bd208cfb707c48520f935d1844beff8fbfb800bb (patch) | |
tree | 362a94b7aac419bf53002ef14cdd8cbefe09b7bb | |
parent | a0502d2ca5cd0f6261715faee8321f0331f19741 (diff) | |
parent | b992512ecec436ecf6f5441095152bd160111b36 (diff) |
Merge remote-tracking branch 'upstream/lineage-18.1' into lineage-18.1HEADlineage-18.1
* upstream/lineage-18.1:
aaudio: unlock when joining the timestamp thread
aaudio: prevent deadlock when stop() calls disconnect()
Change-Id: I7cb22b1c95cdc3b7a97c3b03b13a74e441fcf86b
-rw-r--r-- | services/oboeservice/AAudioServiceStreamBase.cpp | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/services/oboeservice/AAudioServiceStreamBase.cpp b/services/oboeservice/AAudioServiceStreamBase.cpp index 663dae29cc..30deb5df9c 100644 --- a/services/oboeservice/AAudioServiceStreamBase.cpp +++ b/services/oboeservice/AAudioServiceStreamBase.cpp @@ -293,10 +293,6 @@ aaudio_result_t AAudioServiceStreamBase::pause_l() { .set(AMEDIAMETRICS_PROP_STATUS, (int32_t)result) .record(); }); - // Send it now because the timestamp gets rounded up when stopStream() is called below. - // Also we don't need the timestamps while we are shutting down. - sendCurrentTimestamp(); - result = stopTimestampThread(); if (result != AAUDIO_OK) { disconnect_l(); @@ -342,10 +338,12 @@ aaudio_result_t AAudioServiceStreamBase::stop_l() { setState(AAUDIO_STREAM_STATE_STOPPING); - // Send it now because the timestamp gets rounded up when stopStream() is called below. - // Also we don't need the timestamps while we are shutting down. - sendCurrentTimestamp(); // warning - this calls a virtual function + // Temporarily unlock because we are joining the timestamp thread and it may try + // to acquire mLock. + mLock.unlock(); result = stopTimestampThread(); + mLock.lock(); + if (result != AAUDIO_OK) { disconnect_l(); return result; @@ -410,10 +408,11 @@ void AAudioServiceStreamBase::run() { timestampScheduler.start(AudioClock::getNanoseconds()); int64_t nextTime = timestampScheduler.nextAbsoluteTime(); int32_t loopCount = 0; + aaudio_result_t result = AAUDIO_OK; while(mThreadEnabled.load()) { loopCount++; if (AudioClock::getNanoseconds() >= nextTime) { - aaudio_result_t result = sendCurrentTimestamp(); + result = sendCurrentTimestamp(); if (result != AAUDIO_OK) { ALOGE("%s() timestamp thread got result = %d", __func__, result); break; @@ -425,6 +424,11 @@ void AAudioServiceStreamBase::run() { AudioClock::sleepUntilNanoTime(nextTime); } } + // This was moved from the calls in stop_l() and pause_l(), which could cause a deadlock + // if it resulted in a call to disconnect. + if (result == AAUDIO_OK) { + (void) sendCurrentTimestamp(); + } ALOGD("%s() %s exiting after %d loops <<<<<<<<<<<<<< TIMESTAMPS", __func__, getTypeText(), loopCount); } |