diff options
author | Chong Zhang <chz@google.com> | 2014-09-24 18:22:31 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-09-24 18:22:31 +0000 |
commit | c81633f483b2e75962800a4dde2a0eec779b0ad0 (patch) | |
tree | bdac61837f9ae9f1aaf192e52b958118c21b5e8f /media | |
parent | 6f7851724bf938e98d3c253941f73118463d974b (diff) | |
parent | 846202f5483c30ff380fc997c7d4461cce090098 (diff) | |
download | frameworks_av-c81633f483b2e75962800a4dde2a0eec779b0ad0.zip frameworks_av-c81633f483b2e75962800a4dde2a0eec779b0ad0.tar.gz frameworks_av-c81633f483b2e75962800a4dde2a0eec779b0ad0.tar.bz2 |
am 846202f5: Merge "NuCachedSource2: more fixes for source read hang" into lmp-dev
* commit '846202f5483c30ff380fc997c7d4461cce090098':
NuCachedSource2: more fixes for source read hang
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/NuCachedSource2.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp index be2a873..f469d4d 100644 --- a/media/libstagefright/NuCachedSource2.cpp +++ b/media/libstagefright/NuCachedSource2.cpp @@ -254,6 +254,10 @@ void NuCachedSource2::disconnect() { // set mDisconnecting to true, if a fetch returns after // this, the source will be marked as EOS. mDisconnecting = true; + + // explicitly signal mCondition so that the pending readAt() + // will immediately return + mCondition.signal(); } // explicitly disconnect from the source, to allow any @@ -325,7 +329,11 @@ void NuCachedSource2::fetchInternal() { Mutex::Autolock autoLock(mLock); - if (err == ERROR_UNSUPPORTED || err == -EPIPE) { + if (mDisconnecting) { + mNumRetriesLeft = 0; + mFinalStatus = ERROR_END_OF_STREAM; + return; + } else if (err == ERROR_UNSUPPORTED || err == -EPIPE) { // These are errors that are not likely to go away even if we // retry, i.e. the server doesn't support range requests or similar. mNumRetriesLeft = 0; @@ -515,10 +523,14 @@ ssize_t NuCachedSource2::readAt(off64_t offset, void *data, size_t size) { CHECK(mAsyncResult == NULL); msg->post(); - while (mAsyncResult == NULL) { + while (mAsyncResult == NULL && !mDisconnecting) { mCondition.wait(mLock); } + if (mDisconnecting) { + return ERROR_END_OF_STREAM; + } + int32_t result; CHECK(mAsyncResult->findInt32("result", &result)); |