From ff2c6b0d85facde86d4ffdeed903d7f96d9b2d11 Mon Sep 17 00:00:00 2001 From: Hongguang Chen Date: Sat, 7 Aug 2021 00:12:26 +0000 Subject: [PATCH] Add init() to avoid crash when creating ref in constructor. This reverts commit 50899fb2696d2bb98a4807a237e124f566293f57. Bug: 195717690 Fix: 195717690 Test: atest VtsHalTvTunerTargetTest Change-Id: Icae435f1166e6cf2e2f235979e3d1d37d182d517 --- tv/tuner/aidl/default/Demux.cpp | 14 ++++++++------ tv/tuner/aidl/default/Demux.h | 4 ++-- tv/tuner/aidl/default/Dvr.cpp | 3 ++- tv/tuner/aidl/default/Dvr.h | 5 +++-- tv/tuner/aidl/default/Filter.cpp | 2 +- tv/tuner/aidl/default/Filter.h | 4 ++-- tv/tuner/aidl/default/Frontend.cpp | 2 +- tv/tuner/aidl/default/Frontend.h | 4 ++-- tv/tuner/aidl/default/TimeFilter.cpp | 2 +- tv/tuner/aidl/default/TimeFilter.h | 4 ++-- tv/tuner/aidl/default/Tuner.cpp | 26 ++++++++++++++------------ tv/tuner/aidl/default/Tuner.h | 1 + tv/tuner/aidl/default/service.cpp | 1 + 13 files changed, 40 insertions(+), 32 deletions(-) diff --git a/tv/tuner/aidl/default/Demux.cpp b/tv/tuner/aidl/default/Demux.cpp index bdc3849e34..3937c6ab25 100644 --- a/tv/tuner/aidl/default/Demux.cpp +++ b/tv/tuner/aidl/default/Demux.cpp @@ -31,7 +31,7 @@ namespace tuner { #define WAIT_TIMEOUT 3000000000 -Demux::Demux(int32_t demuxId, Tuner* tuner) { +Demux::Demux(int32_t demuxId, std::shared_ptr tuner) { mDemuxId = demuxId; mTuner = tuner; } @@ -75,8 +75,8 @@ Demux::~Demux() { static_cast(Result::INVALID_ARGUMENT)); } - std::shared_ptr filter = - ndk::SharedRefBase::make(in_type, filterId, in_bufferSize, in_cb, this); + std::shared_ptr filter = ndk::SharedRefBase::make( + in_type, filterId, in_bufferSize, in_cb, this->ref()); if (!filter->createFilterMQ()) { *_aidl_return = nullptr; return ::ndk::ScopedAStatus::fromServiceSpecificError( @@ -110,7 +110,7 @@ Demux::~Demux() { ::ndk::ScopedAStatus Demux::openTimeFilter(std::shared_ptr* _aidl_return) { ALOGV("%s", __FUNCTION__); - mTimeFilter = ndk::SharedRefBase::make(this); + mTimeFilter = ndk::SharedRefBase::make(this->ref()); *_aidl_return = mTimeFilter; return ::ndk::ScopedAStatus::ok(); @@ -201,7 +201,8 @@ Demux::~Demux() { set::iterator it; switch (in_type) { case DvrType::PLAYBACK: - mDvrPlayback = ndk::SharedRefBase::make(in_type, in_bufferSize, in_cb, this); + mDvrPlayback = ndk::SharedRefBase::make(in_type, in_bufferSize, in_cb, + this->ref()); if (!mDvrPlayback->createDvrMQ()) { mDvrPlayback = nullptr; *_aidl_return = mDvrPlayback; @@ -222,7 +223,8 @@ Demux::~Demux() { *_aidl_return = mDvrPlayback; return ::ndk::ScopedAStatus::ok(); case DvrType::RECORD: - mDvrRecord = ndk::SharedRefBase::make(in_type, in_bufferSize, in_cb, this); + mDvrRecord = ndk::SharedRefBase::make(in_type, in_bufferSize, in_cb, + this->ref()); if (!mDvrRecord->createDvrMQ()) { mDvrRecord = nullptr; *_aidl_return = mDvrRecord; diff --git a/tv/tuner/aidl/default/Demux.h b/tv/tuner/aidl/default/Demux.h index 4cfcaab2ac..4d9b7fe911 100644 --- a/tv/tuner/aidl/default/Demux.h +++ b/tv/tuner/aidl/default/Demux.h @@ -50,7 +50,7 @@ class Tuner; class Demux : public BnDemux { public: - Demux(int32_t demuxId, Tuner* tuner); + Demux(int32_t demuxId, std::shared_ptr tuner); ~Demux(); ::ndk::ScopedAStatus setFrontendDataSource(int32_t in_frontendId) override; @@ -95,7 +95,7 @@ class Demux : public BnDemux { private: // Tuner service - Tuner* mTuner; + std::shared_ptr mTuner; // Frontend source std::shared_ptr mFrontend; diff --git a/tv/tuner/aidl/default/Dvr.cpp b/tv/tuner/aidl/default/Dvr.cpp index 7c9c44c76f..9eadb8ce19 100644 --- a/tv/tuner/aidl/default/Dvr.cpp +++ b/tv/tuner/aidl/default/Dvr.cpp @@ -31,7 +31,8 @@ namespace tuner { #define WAIT_TIMEOUT 3000000000 -Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr& cb, Demux* demux) { +Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr& cb, + std::shared_ptr demux) { mType = type; mBufferSize = bufferSize; mCallback = cb; diff --git a/tv/tuner/aidl/default/Dvr.h b/tv/tuner/aidl/default/Dvr.h index 2e964495e3..68933aed70 100644 --- a/tv/tuner/aidl/default/Dvr.h +++ b/tv/tuner/aidl/default/Dvr.h @@ -57,7 +57,8 @@ class Tuner; class Dvr : public BnDvr { public: - Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr& cb, Demux* demux); + Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr& cb, + std::shared_ptr demux); ~Dvr(); ::ndk::ScopedAStatus getQueueDesc( @@ -87,7 +88,7 @@ class Dvr : public BnDvr { private: // Demux service - Demux* mDemux; + std::shared_ptr mDemux; DvrType mType; uint32_t mBufferSize; diff --git a/tv/tuner/aidl/default/Filter.cpp b/tv/tuner/aidl/default/Filter.cpp index 681eb04409..77ca2ee62b 100644 --- a/tv/tuner/aidl/default/Filter.cpp +++ b/tv/tuner/aidl/default/Filter.cpp @@ -37,7 +37,7 @@ namespace tuner { Filter::Filter() {} Filter::Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize, - const std::shared_ptr& cb, Demux* demux) { + const std::shared_ptr& cb, std::shared_ptr demux) { mType = type; mFilterId = filterId; mBufferSize = bufferSize; diff --git a/tv/tuner/aidl/default/Filter.h b/tv/tuner/aidl/default/Filter.h index 1dbba453e5..30eb24bda8 100644 --- a/tv/tuner/aidl/default/Filter.h +++ b/tv/tuner/aidl/default/Filter.h @@ -54,7 +54,7 @@ class Filter : public BnFilter { Filter(); Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize, - const std::shared_ptr& cb, Demux* demux); + const std::shared_ptr& cb, std::shared_ptr demux); ~Filter(); @@ -97,7 +97,7 @@ class Filter : public BnFilter { private: // Demux service - Demux* mDemux; + std::shared_ptr mDemux; // Dvr reference once the filter is attached to any std::shared_ptr mDvr = nullptr; /** diff --git a/tv/tuner/aidl/default/Frontend.cpp b/tv/tuner/aidl/default/Frontend.cpp index 78d8279b9b..438f897446 100644 --- a/tv/tuner/aidl/default/Frontend.cpp +++ b/tv/tuner/aidl/default/Frontend.cpp @@ -28,7 +28,7 @@ namespace hardware { namespace tv { namespace tuner { -Frontend::Frontend(FrontendType type, int32_t id, Tuner* tuner) { +Frontend::Frontend(FrontendType type, int32_t id, std::shared_ptr tuner) { mType = type; mId = id; mTuner = tuner; diff --git a/tv/tuner/aidl/default/Frontend.h b/tv/tuner/aidl/default/Frontend.h index a98cc92f6d..3c602cff8f 100644 --- a/tv/tuner/aidl/default/Frontend.h +++ b/tv/tuner/aidl/default/Frontend.h @@ -33,7 +33,7 @@ class Tuner; class Frontend : public BnFrontend { public: - Frontend(FrontendType type, int32_t id, Tuner* tuner); + Frontend(FrontendType type, int32_t id, std::shared_ptr tuner); ::ndk::ScopedAStatus setCallback( const std::shared_ptr& in_callback) override; @@ -59,7 +59,7 @@ class Frontend : public BnFrontend { virtual ~Frontend(); bool supportsSatellite(); std::shared_ptr mCallback; - Tuner* mTuner; + std::shared_ptr mTuner; FrontendType mType = FrontendType::UNDEFINED; int32_t mId = 0; bool mIsLocked = false; diff --git a/tv/tuner/aidl/default/TimeFilter.cpp b/tv/tuner/aidl/default/TimeFilter.cpp index 3b1edd2ba1..dde7be34ca 100644 --- a/tv/tuner/aidl/default/TimeFilter.cpp +++ b/tv/tuner/aidl/default/TimeFilter.cpp @@ -30,7 +30,7 @@ namespace tuner { TimeFilter::TimeFilter() {} -TimeFilter::TimeFilter(Demux* demux) { +TimeFilter::TimeFilter(std::shared_ptr demux) { mDemux = demux; } diff --git a/tv/tuner/aidl/default/TimeFilter.h b/tv/tuner/aidl/default/TimeFilter.h index 44e941c18b..ff35c47d70 100644 --- a/tv/tuner/aidl/default/TimeFilter.h +++ b/tv/tuner/aidl/default/TimeFilter.h @@ -35,7 +35,7 @@ class Demux; class TimeFilter : public BnTimeFilter { public: TimeFilter(); - TimeFilter(Demux* demux); + TimeFilter(std::shared_ptr demux); ~TimeFilter(); ::ndk::ScopedAStatus setTimeStamp(int64_t in_timeStamp) override; @@ -45,7 +45,7 @@ class TimeFilter : public BnTimeFilter { ::ndk::ScopedAStatus close() override; private: - Demux* mDemux; + std::shared_ptr mDemux; uint64_t mTimeStamp = INVALID_TIME_STAMP; time_t mBeginTime; }; diff --git a/tv/tuner/aidl/default/Tuner.cpp b/tv/tuner/aidl/default/Tuner.cpp index 7e49660130..678be54dbe 100644 --- a/tv/tuner/aidl/default/Tuner.cpp +++ b/tv/tuner/aidl/default/Tuner.cpp @@ -32,20 +32,22 @@ namespace hardware { namespace tv { namespace tuner { -Tuner::Tuner() { +Tuner::Tuner() {} + +void Tuner::init() { // Static Frontends array to maintain local frontends information // Array index matches their FrontendId in the default impl mFrontendSize = 10; - mFrontends[0] = ndk::SharedRefBase::make(FrontendType::ISDBS, 0, this); - mFrontends[1] = ndk::SharedRefBase::make(FrontendType::ATSC3, 1, this); - mFrontends[2] = ndk::SharedRefBase::make(FrontendType::DVBC, 2, this); - mFrontends[3] = ndk::SharedRefBase::make(FrontendType::DVBS, 3, this); - mFrontends[4] = ndk::SharedRefBase::make(FrontendType::DVBT, 4, this); - mFrontends[5] = ndk::SharedRefBase::make(FrontendType::ISDBT, 5, this); - mFrontends[6] = ndk::SharedRefBase::make(FrontendType::ANALOG, 6, this); - mFrontends[7] = ndk::SharedRefBase::make(FrontendType::ATSC, 7, this); - mFrontends[8] = ndk::SharedRefBase::make(FrontendType::ISDBS3, 8, this); - mFrontends[9] = ndk::SharedRefBase::make(FrontendType::DTMB, 9, this); + mFrontends[0] = ndk::SharedRefBase::make(FrontendType::ISDBS, 0, this->ref()); + mFrontends[1] = ndk::SharedRefBase::make(FrontendType::ATSC3, 1, this->ref()); + mFrontends[2] = ndk::SharedRefBase::make(FrontendType::DVBC, 2, this->ref()); + mFrontends[3] = ndk::SharedRefBase::make(FrontendType::DVBS, 3, this->ref()); + mFrontends[4] = ndk::SharedRefBase::make(FrontendType::DVBT, 4, this->ref()); + mFrontends[5] = ndk::SharedRefBase::make(FrontendType::ISDBT, 5, this->ref()); + mFrontends[6] = ndk::SharedRefBase::make(FrontendType::ANALOG, 6, this->ref()); + mFrontends[7] = ndk::SharedRefBase::make(FrontendType::ATSC, 7, this->ref()); + mFrontends[8] = ndk::SharedRefBase::make(FrontendType::ISDBS3, 8, this->ref()); + mFrontends[9] = ndk::SharedRefBase::make(FrontendType::DTMB, 9, this->ref()); vector statusCaps; @@ -212,7 +214,7 @@ Tuner::~Tuner() {} ALOGV("%s", __FUNCTION__); mLastUsedId += 1; - mDemuxes[mLastUsedId] = ndk::SharedRefBase::make(mLastUsedId, this); + mDemuxes[mLastUsedId] = ndk::SharedRefBase::make(mLastUsedId, this->ref()); out_demuxId->push_back(mLastUsedId); *_aidl_return = mDemuxes[mLastUsedId]; diff --git a/tv/tuner/aidl/default/Tuner.h b/tv/tuner/aidl/default/Tuner.h index e69990d119..7af7ab8d53 100644 --- a/tv/tuner/aidl/default/Tuner.h +++ b/tv/tuner/aidl/default/Tuner.h @@ -63,6 +63,7 @@ class Tuner : public BnTuner { void frontendStopTune(int32_t frontendId); void removeDemux(int32_t demuxId); void removeFrontend(int32_t frontendId); + void init(); private: // Static mFrontends array to maintain local frontends information diff --git a/tv/tuner/aidl/default/service.cpp b/tv/tuner/aidl/default/service.cpp index 649b76375d..ac8d779c28 100644 --- a/tv/tuner/aidl/default/service.cpp +++ b/tv/tuner/aidl/default/service.cpp @@ -28,6 +28,7 @@ using ::aidl::android::hardware::tv::tuner::Tuner; int main() { ABinderProcess_setThreadPoolMaxThreadCount(8); std::shared_ptr tuner = ndk::SharedRefBase::make(); + tuner->init(); const std::string instance = std::string() + Tuner::descriptor + "/default"; binder_status_t status = AServiceManager_addService(tuner->asBinder().get(), instance.c_str());