diff options
author | Robert Shih <robertshih@google.com> | 2015-09-02 14:02:47 -0700 |
---|---|---|
committer | Steve Kondik <steve@cyngn.com> | 2015-12-07 18:45:16 -0800 |
commit | 7f8512331f105565054202486fa0a6094ad693c1 (patch) | |
tree | 4e40968ac0395bc5c8370477412e64c5d0158ef6 | |
parent | 56b6cf5b7f5648ab071bd24136006b9d84066005 (diff) | |
download | frameworks_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.cpp | 22 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/GenericSource.h | 1 |
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; |