diff options
author | Haynes Mathew George <hgeorge@codeaurora.org> | 2014-03-05 20:01:11 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-03-05 20:01:11 +0000 |
commit | d384a2c44810ce1b51277cc4ab4c5415ff7de6ee (patch) | |
tree | c020402fdf9734df5c77b93058b841d9c501a4ef /services/audioflinger | |
parent | 3cd7a13a7926e210bd8dff65d6f43a257f5235e5 (diff) | |
parent | 4f9e38c60cc79407a8b2966b3b9780a3e395b017 (diff) | |
download | frameworks_av-d384a2c44810ce1b51277cc4ab4c5415ff7de6ee.zip frameworks_av-d384a2c44810ce1b51277cc4ab4c5415ff7de6ee.tar.gz frameworks_av-d384a2c44810ce1b51277cc4ab4c5415ff7de6ee.tar.bz2 |
am 4f9e38c6: am 21e81bca: am e010f65e: audioflinger: Fix for a deadlock in track creation
* commit '4f9e38c60cc79407a8b2966b3b9780a3e395b017':
audioflinger: Fix for a deadlock in track creation
Diffstat (limited to 'services/audioflinger')
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/Threads.cpp | 4 |
2 files changed, 6 insertions, 2 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index e9c38e3..26dac95 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -513,6 +513,8 @@ sp<IAudioTrack> AudioFlinger::createTrack( track = thread->createTrack_l(client, streamType, sampleRate, format, channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, clientUid, &lStatus); + 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 // for a track to be created @@ -1291,7 +1293,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) { // remove local strong reference to Client before deleting the RecordTrack so that the diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 498ddb6..f0f5a4d 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -1324,8 +1324,10 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrac track = TimedTrack::create(this, client, streamType, sampleRate, format, channelMask, frameCount, sharedBuffer, sessionId, uid); } + if (track == 0 || track->getCblk() == NULL || track->name() < 0) { lStatus = NO_MEMORY; + // track must be cleared from the caller as the caller has the AF lock goto Exit; } @@ -4741,7 +4743,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createR if (track->getCblk() == 0) { ALOGE("createRecordTrack_l() no control block"); lStatus = NO_MEMORY; - track.clear(); + // track must be cleared from the caller as the caller has the AF lock goto Exit; } mTracks.add(track); |