Add Mutex in FilterClient for thread-safe

Bug: 203506183
Test: DTV channel change PASS
Change-Id: Id4efbd37885a93dfc4f9b69ace03291eab58aa6b
This commit is contained in:
Daren Liao 2021-10-14 18:28:45 +08:00 committed by Hongguang Chen
parent 06aea33078
commit e3cbee3cb0
3 changed files with 20 additions and 0 deletions

View File

@ -461,6 +461,7 @@ MediaEvent::MediaEvent(sp<FilterClient> filterClient, native_handle_t *avHandle,
}
MediaEvent::~MediaEvent() {
android::Mutex::Autolock autoLock(mLock);
JNIEnv *env = AndroidRuntime::getJNIEnv();
env->DeleteWeakGlobalRef(mMediaEventObj);
mMediaEventObj = nullptr;

View File

@ -43,6 +43,7 @@ FilterClient::FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerF
}
FilterClient::~FilterClient() {
Mutex::Autolock _l(mLock);
mTunerFilter = nullptr;
mAvSharedHandle = nullptr;
mAvSharedMemSize = 0;
@ -74,6 +75,7 @@ Result FilterClient::configure(DemuxFilterSettings configure) {
Result res;
checkIsPassthroughFilter(configure);
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configure(configure);
res = ClientHelper::getServiceSpecificErrorCode(s);
@ -87,6 +89,7 @@ Result FilterClient::configure(DemuxFilterSettings configure) {
}
Result FilterClient::configureMonitorEvent(int32_t monitorEventType) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureMonitorEvent(monitorEventType);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -96,6 +99,7 @@ Result FilterClient::configureMonitorEvent(int32_t monitorEventType) {
}
Result FilterClient::configureIpFilterContextId(int32_t cid) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureIpFilterContextId(cid);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -105,6 +109,7 @@ Result FilterClient::configureIpFilterContextId(int32_t cid) {
}
Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->configureAvStreamType(avStreamType);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -114,6 +119,7 @@ Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
}
Result FilterClient::start() {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->start();
return ClientHelper::getServiceSpecificErrorCode(s);
@ -123,6 +129,7 @@ Result FilterClient::start() {
}
Result FilterClient::stop() {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->stop();
return ClientHelper::getServiceSpecificErrorCode(s);
@ -132,6 +139,7 @@ Result FilterClient::stop() {
}
Result FilterClient::flush() {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->flush();
return ClientHelper::getServiceSpecificErrorCode(s);
@ -141,6 +149,7 @@ Result FilterClient::flush() {
}
Result FilterClient::getId(int32_t& id) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->getId(&id);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -150,6 +159,7 @@ Result FilterClient::getId(int32_t& id) {
}
Result FilterClient::getId64Bit(int64_t& id) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->getId64Bit(&id);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -159,6 +169,7 @@ Result FilterClient::getId64Bit(int64_t& id) {
}
Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->releaseAvHandle(dupToAidl(handle), avDataId);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -168,6 +179,7 @@ Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId)
}
Result FilterClient::setDataSource(sp<FilterClient> filterClient){
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter());
return ClientHelper::getServiceSpecificErrorCode(s);
@ -177,6 +189,7 @@ Result FilterClient::setDataSource(sp<FilterClient> filterClient){
}
Result FilterClient::close() {
Mutex::Autolock _l(mLock);
if (mFilterMQEventFlag != nullptr) {
EventFlag::deleteEventFlag(&mFilterMQEventFlag);
mFilterMQEventFlag = nullptr;
@ -197,6 +210,7 @@ Result FilterClient::close() {
}
string FilterClient::acquireSharedFilterToken() {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
string filterToken;
if (mTunerFilter->acquireSharedFilterToken(&filterToken).isOk()) {
@ -208,6 +222,7 @@ string FilterClient::acquireSharedFilterToken() {
}
Result FilterClient::freeSharedFilterToken(const string& filterToken) {
Mutex::Autolock _l(mLock);
if (mTunerFilter != nullptr) {
Status s = mTunerFilter->freeSharedFilterToken(filterToken);
return ClientHelper::getServiceSpecificErrorCode(s);
@ -237,6 +252,7 @@ Status TunerFilterCallback::onFilterEvent(const vector<DemuxFilterEvent>& filter
}
Result FilterClient::getFilterMq() {
Mutex::Autolock _l(mLock);
if (mFilterMQ != nullptr) {
return Result::SUCCESS;
}

View File

@ -21,6 +21,7 @@
#include <aidl/android/media/tv/tuner/BnTunerFilterCallback.h>
#include <aidl/android/media/tv/tuner/ITunerFilter.h>
#include <fmq/AidlMessageQueue.h>
#include <utils/Mutex.h>
#include "ClientHelper.h"
#include "FilterClientCallback.h"
@ -37,6 +38,7 @@ using ::aidl::android::hardware::tv::tuner::FilterDelayHint;
using ::aidl::android::media::tv::tuner::BnTunerFilterCallback;
using ::aidl::android::media::tv::tuner::ITunerFilter;
using ::android::hardware::EventFlag;
using ::android::Mutex;
using namespace std;
@ -179,6 +181,7 @@ private:
uint64_t mAvSharedMemSize;
bool mIsMediaFilter;
bool mIsPassthroughFilter;
Mutex mLock;
};
} // namespace android