diff options
author | Haynes Mathew George <hgeorge@codeaurora.org> | 2013-12-13 15:40:13 -0800 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2014-01-30 09:21:12 -0800 |
commit | 03e9e83c47ab4a518da0a1f36b8f702f59221c95 (patch) | |
tree | 6a30fab83e374a28995a02112856be02defbeb7a /services/audioflinger/AudioFlinger.cpp | |
parent | 9be49c915852b592a881be3905658e4fc698749d (diff) | |
download | frameworks_av-03e9e83c47ab4a518da0a1f36b8f702f59221c95.zip frameworks_av-03e9e83c47ab4a518da0a1f36b8f702f59221c95.tar.gz frameworks_av-03e9e83c47ab4a518da0a1f36b8f702f59221c95.tar.bz2 |
audioflinger: Fix for a deadlock in track creation
AudioFlinger enters a deadlock (with itself) on trying to free a
RecordTrack or Track object that failed initialization. Clear this
bad object from the caller instead.
Bug: 12423233
Change-Id: I926f2beb922a70f6924e593e2bbf1a5b5df85b16
Diffstat (limited to 'services/audioflinger/AudioFlinger.cpp')
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index f9cc17b..e36dba0 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -559,7 +559,7 @@ sp<IAudioTrack> AudioFlinger::createTrack( track = thread->createTrack_l(client, streamType, sampleRate, format, channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, clientUid, &lStatus); - LOG_ALWAYS_FATAL_IF((track != 0) != (lStatus == NO_ERROR)); + LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (track == 0)); // we don't abort yet if lStatus != NO_ERROR; there is still work to be done regardless // move effect chain to this output thread if an effect on same session was waiting @@ -1340,7 +1340,7 @@ sp<IAudioRecord> AudioFlinger::openRecord( frameCount, lSessionId, IPCThreadState::self()->getCallingUid(), flags, tid, &lStatus); - LOG_ALWAYS_FATAL_IF((recordTrack != 0) != (lStatus == NO_ERROR)); + LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0)); } if (lStatus != NO_ERROR) { |