Add init() to avoid crash when creating ref in constructor.

This reverts commit 50899fb269.

Bug: 195717690
Fix: 195717690
Test: atest VtsHalTvTunerTargetTest
Change-Id: Icae435f1166e6cf2e2f235979e3d1d37d182d517
This commit is contained in:
Hongguang Chen
2021-08-07 00:12:26 +00:00
committed by Hongguang
parent 725ae11a95
commit ff2c6b0d85
13 changed files with 40 additions and 32 deletions

View File

@@ -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> tuner) {
mDemuxId = demuxId;
mTuner = tuner;
}
@@ -75,8 +75,8 @@ Demux::~Demux() {
static_cast<int32_t>(Result::INVALID_ARGUMENT));
}
std::shared_ptr<Filter> filter =
ndk::SharedRefBase::make<Filter>(in_type, filterId, in_bufferSize, in_cb, this);
std::shared_ptr<Filter> filter = ndk::SharedRefBase::make<Filter>(
in_type, filterId, in_bufferSize, in_cb, this->ref<Demux>());
if (!filter->createFilterMQ()) {
*_aidl_return = nullptr;
return ::ndk::ScopedAStatus::fromServiceSpecificError(
@@ -110,7 +110,7 @@ Demux::~Demux() {
::ndk::ScopedAStatus Demux::openTimeFilter(std::shared_ptr<ITimeFilter>* _aidl_return) {
ALOGV("%s", __FUNCTION__);
mTimeFilter = ndk::SharedRefBase::make<TimeFilter>(this);
mTimeFilter = ndk::SharedRefBase::make<TimeFilter>(this->ref<Demux>());
*_aidl_return = mTimeFilter;
return ::ndk::ScopedAStatus::ok();
@@ -201,7 +201,8 @@ Demux::~Demux() {
set<int64_t>::iterator it;
switch (in_type) {
case DvrType::PLAYBACK:
mDvrPlayback = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb, this);
mDvrPlayback = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb,
this->ref<Demux>());
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<Dvr>(in_type, in_bufferSize, in_cb, this);
mDvrRecord = ndk::SharedRefBase::make<Dvr>(in_type, in_bufferSize, in_cb,
this->ref<Demux>());
if (!mDvrRecord->createDvrMQ()) {
mDvrRecord = nullptr;
*_aidl_return = mDvrRecord;

View File

@@ -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> 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<Tuner> mTuner;
// Frontend source
std::shared_ptr<Frontend> mFrontend;

View File

@@ -31,7 +31,8 @@ namespace tuner {
#define WAIT_TIMEOUT 3000000000
Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, Demux* demux) {
Dvr::Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb,
std::shared_ptr<Demux> demux) {
mType = type;
mBufferSize = bufferSize;
mCallback = cb;

View File

@@ -57,7 +57,8 @@ class Tuner;
class Dvr : public BnDvr {
public:
Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, Demux* demux);
Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb,
std::shared_ptr<Demux> demux);
~Dvr();
::ndk::ScopedAStatus getQueueDesc(
@@ -87,7 +88,7 @@ class Dvr : public BnDvr {
private:
// Demux service
Demux* mDemux;
std::shared_ptr<Demux> mDemux;
DvrType mType;
uint32_t mBufferSize;

View File

@@ -37,7 +37,7 @@ namespace tuner {
Filter::Filter() {}
Filter::Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize,
const std::shared_ptr<IFilterCallback>& cb, Demux* demux) {
const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux) {
mType = type;
mFilterId = filterId;
mBufferSize = bufferSize;

View File

@@ -54,7 +54,7 @@ class Filter : public BnFilter {
Filter();
Filter(DemuxFilterType type, int64_t filterId, uint32_t bufferSize,
const std::shared_ptr<IFilterCallback>& cb, Demux* demux);
const std::shared_ptr<IFilterCallback>& cb, std::shared_ptr<Demux> demux);
~Filter();
@@ -97,7 +97,7 @@ class Filter : public BnFilter {
private:
// Demux service
Demux* mDemux;
std::shared_ptr<Demux> mDemux;
// Dvr reference once the filter is attached to any
std::shared_ptr<Dvr> mDvr = nullptr;
/**

View File

@@ -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> tuner) {
mType = type;
mId = id;
mTuner = tuner;

View File

@@ -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> tuner);
::ndk::ScopedAStatus setCallback(
const std::shared_ptr<IFrontendCallback>& in_callback) override;
@@ -59,7 +59,7 @@ class Frontend : public BnFrontend {
virtual ~Frontend();
bool supportsSatellite();
std::shared_ptr<IFrontendCallback> mCallback;
Tuner* mTuner;
std::shared_ptr<Tuner> mTuner;
FrontendType mType = FrontendType::UNDEFINED;
int32_t mId = 0;
bool mIsLocked = false;

View File

@@ -30,7 +30,7 @@ namespace tuner {
TimeFilter::TimeFilter() {}
TimeFilter::TimeFilter(Demux* demux) {
TimeFilter::TimeFilter(std::shared_ptr<Demux> demux) {
mDemux = demux;
}

View File

@@ -35,7 +35,7 @@ class Demux;
class TimeFilter : public BnTimeFilter {
public:
TimeFilter();
TimeFilter(Demux* demux);
TimeFilter(std::shared_ptr<Demux> 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<Demux> mDemux;
uint64_t mTimeStamp = INVALID_TIME_STAMP;
time_t mBeginTime;
};

View File

@@ -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<Frontend>(FrontendType::ISDBS, 0, this);
mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1, this);
mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2, this);
mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3, this);
mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4, this);
mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5, this);
mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6, this);
mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7, this);
mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8, this);
mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9, this);
mFrontends[0] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS, 0, this->ref<Tuner>());
mFrontends[1] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC3, 1, this->ref<Tuner>());
mFrontends[2] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBC, 2, this->ref<Tuner>());
mFrontends[3] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBS, 3, this->ref<Tuner>());
mFrontends[4] = ndk::SharedRefBase::make<Frontend>(FrontendType::DVBT, 4, this->ref<Tuner>());
mFrontends[5] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBT, 5, this->ref<Tuner>());
mFrontends[6] = ndk::SharedRefBase::make<Frontend>(FrontendType::ANALOG, 6, this->ref<Tuner>());
mFrontends[7] = ndk::SharedRefBase::make<Frontend>(FrontendType::ATSC, 7, this->ref<Tuner>());
mFrontends[8] = ndk::SharedRefBase::make<Frontend>(FrontendType::ISDBS3, 8, this->ref<Tuner>());
mFrontends[9] = ndk::SharedRefBase::make<Frontend>(FrontendType::DTMB, 9, this->ref<Tuner>());
vector<FrontendStatusType> statusCaps;
@@ -212,7 +214,7 @@ Tuner::~Tuner() {}
ALOGV("%s", __FUNCTION__);
mLastUsedId += 1;
mDemuxes[mLastUsedId] = ndk::SharedRefBase::make<Demux>(mLastUsedId, this);
mDemuxes[mLastUsedId] = ndk::SharedRefBase::make<Demux>(mLastUsedId, this->ref<Tuner>());
out_demuxId->push_back(mLastUsedId);
*_aidl_return = mDemuxes[mLastUsedId];

View File

@@ -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

View File

@@ -28,6 +28,7 @@ using ::aidl::android::hardware::tv::tuner::Tuner;
int main() {
ABinderProcess_setThreadPoolMaxThreadCount(8);
std::shared_ptr<Tuner> tuner = ndk::SharedRefBase::make<Tuner>();
tuner->init();
const std::string instance = std::string() + Tuner::descriptor + "/default";
binder_status_t status = AServiceManager_addService(tuner->asBinder().get(), instance.c_str());