summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Shih <robertshih@google.com>2015-09-02 14:02:47 -0700
committerSteve Kondik <steve@cyngn.com>2015-12-07 18:45:16 -0800
commit7f8512331f105565054202486fa0a6094ad693c1 (patch)
tree4e40968ac0395bc5c8370477412e64c5d0158ef6
parent56b6cf5b7f5648ab071bd24136006b9d84066005 (diff)
downloadframeworks_av-7f8512331f105565054202486fa0a6094ad693c1.zip
frameworks_av-7f8512331f105565054202486fa0a6094ad693c1.tar.gz
frameworks_av-7f8512331f105565054202486fa0a6094ad693c1.tar.bz2
Protect data source access with mutex during disconnect
Bug: 23658148 Change-Id: Ic37cac7b5d166143e0b77e9919b0aaef486e4fdd
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.cpp22
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.h1
2 files changed, 15 insertions, 8 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index 2341817..056c85f 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -496,10 +496,17 @@ void NuPlayer::GenericSource::finishPrepareAsync() {
void NuPlayer::GenericSource::notifyPreparedAndCleanup(status_t err) {
if (err != OK) {
- Mutex::Autolock _l(mSourceLock);
- mDataSource.clear();
- mCachedSource.clear();
- mHttpSource.clear();
+ {
+ sp<DataSource> dataSource = mDataSource;
+ sp<NuCachedSource2> cachedSource = mCachedSource;
+ sp<DataSource> httpSource = mHttpSource;
+ {
+ Mutex::Autolock _l(mDisconnectLock);
+ mDataSource.clear();
+ mCachedSource.clear();
+ mHttpSource.clear();
+ }
+ }
mBitrate = -1;
cancelPollBuffering();
@@ -552,14 +559,13 @@ void NuPlayer::GenericSource::resume() {
}
void NuPlayer::GenericSource::disconnect() {
-
- sp<DataSource> dataSource;
- sp<DataSource> httpSource;
+ sp<DataSource> dataSource, httpSource;
{
- Mutex::Autolock _l(mSourceLock);
+ Mutex::Autolock _l(mDisconnectLock);
dataSource = mDataSource;
httpSource = mHttpSource;
}
+
if (dataSource != NULL) {
// disconnect data source
if (dataSource->flags() & DataSource::kIsCachingDataSource) {
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h
index c1d6e3e..9f8556e 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.h
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.h
@@ -155,6 +155,7 @@ protected:
int32_t mPrevBufferPercentage;
mutable Mutex mReadBufferLock;
+ mutable Mutex mDisconnectLock;
sp<ALooper> mLooper;