summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2014-09-24 18:22:31 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-09-24 18:22:31 +0000
commitc81633f483b2e75962800a4dde2a0eec779b0ad0 (patch)
treebdac61837f9ae9f1aaf192e52b958118c21b5e8f /media
parent6f7851724bf938e98d3c253941f73118463d974b (diff)
parent846202f5483c30ff380fc997c7d4461cce090098 (diff)
downloadframeworks_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.cpp16
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));