diff --git a/tv/hdmi/connection/aidl/default/HdmiConnectionMock.cpp b/tv/hdmi/connection/aidl/default/HdmiConnectionMock.cpp index 8f4411bd8e..954982e4bc 100644 --- a/tv/hdmi/connection/aidl/default/HdmiConnectionMock.cpp +++ b/tv/hdmi/connection/aidl/default/HdmiConnectionMock.cpp @@ -15,12 +15,11 @@ */ #define LOG_TAG "android.hardware.tv.hdmi.connection" +#include "HdmiConnectionMock.h" #include #include #include -#include "HdmiConnectionMock.h" - using ndk::ScopedAStatus; namespace android { @@ -34,6 +33,7 @@ void HdmiConnectionMock::serviceDied(void* cookie) { ALOGE("HdmiConnectionMock died"); auto hdmi = static_cast(cookie); hdmi->mHdmiThreadRun = false; + pthread_join(hdmi->mThreadId, NULL); } ScopedAStatus HdmiConnectionMock::getPortInfo(std::vector* _aidl_return) { @@ -55,12 +55,15 @@ ScopedAStatus HdmiConnectionMock::isConnected(int32_t portId, bool* _aidl_return ScopedAStatus HdmiConnectionMock::setCallback( const std::shared_ptr& callback) { if (mCallback != nullptr) { + stopThread(); mCallback = nullptr; } - if (callback != nullptr) { mCallback = callback; - AIBinder_linkToDeath(this->asBinder().get(), mDeathRecipient.get(), 0 /* cookie */); + mDeathRecipient = + ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied)); + + AIBinder_linkToDeath(callback->asBinder().get(), mDeathRecipient.get(), this /* cookie */); mInputFile = open(HDMI_MSG_IN_FIFO, O_RDWR | O_CLOEXEC); pthread_create(&mThreadId, NULL, __threadLoop, this); @@ -153,7 +156,7 @@ void HdmiConnectionMock::threadLoop() { int r = -1; // Open the input pipe - while (mInputFile < 0) { + while (mHdmiThreadRun && mInputFile < 0) { usleep(1000 * 1000); mInputFile = open(HDMI_MSG_IN_FIFO, O_RDONLY | O_CLOEXEC); } @@ -193,7 +196,21 @@ HdmiConnectionMock::HdmiConnectionMock() { .physicalAddress = mPhysicalAddress}; mPortConnectionStatus[0] = false; mHpdSignal[0] = HpdSignal::HDMI_HPD_PHYSICAL; - mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(AIBinder_DeathRecipient_new(serviceDied)); + mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); +} + +void HdmiConnectionMock::stopThread() { + if (mCallback != nullptr) { + ALOGE("[halimp_aidl] HdmiConnectionMock shutting down."); + mCallback = nullptr; + mDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(nullptr); + mHdmiThreadRun = false; + pthread_join(mThreadId, NULL); + } +} + +HdmiConnectionMock::~HdmiConnectionMock() { + stopThread(); } } // namespace implementation diff --git a/tv/hdmi/connection/aidl/default/HdmiConnectionMock.h b/tv/hdmi/connection/aidl/default/HdmiConnectionMock.h index c013fddd56..8c66f08c0c 100644 --- a/tv/hdmi/connection/aidl/default/HdmiConnectionMock.h +++ b/tv/hdmi/connection/aidl/default/HdmiConnectionMock.h @@ -41,7 +41,7 @@ using ::aidl::android::hardware::tv::hdmi::connection::Result; struct HdmiConnectionMock : public BnHdmiConnection { HdmiConnectionMock(); - + ~HdmiConnectionMock(); ::ndk::ScopedAStatus getPortInfo(std::vector* _aidl_return) override; ::ndk::ScopedAStatus isConnected(int32_t portId, bool* _aidl_return) override; ::ndk::ScopedAStatus setCallback( @@ -56,6 +56,7 @@ struct HdmiConnectionMock : public BnHdmiConnection { void threadLoop(); int readMessageFromFifo(unsigned char* buf, int msgCount); void handleHotplugMessage(unsigned char* msgBuf); + void stopThread(); private: static void serviceDied(void* cookie);