diff options
author | Chong Zhang <chz@google.com> | 2014-09-24 17:41:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-09-24 17:41:09 +0000 |
commit | 846202f5483c30ff380fc997c7d4461cce090098 (patch) | |
tree | dfbfb84d006cf1fa3528cc8b620160ad06988ed1 /media | |
parent | 80ec934ae7d4e3a78af87554fdb77a58f6386ba0 (diff) | |
parent | 9f3d1cffe3bbec35c1fb7fc7e206428728ac234e (diff) | |
download | frameworks_av-846202f5483c30ff380fc997c7d4461cce090098.zip frameworks_av-846202f5483c30ff380fc997c7d4461cce090098.tar.gz frameworks_av-846202f5483c30ff380fc997c7d4461cce090098.tar.bz2 |
Merge "NuCachedSource2: more fixes for source read hang" into lmp-dev
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)); |