Merge "HDMI Connection Fuzzer Fix" into main
This commit is contained in:
commit
3d3dab4875
2 changed files with 25 additions and 7 deletions
|
@ -15,12 +15,11 @@
|
|||
*/
|
||||
|
||||
#define LOG_TAG "android.hardware.tv.hdmi.connection"
|
||||
#include "HdmiConnectionMock.h"
|
||||
#include <android-base/logging.h>
|
||||
#include <fcntl.h>
|
||||
#include <utils/Log.h>
|
||||
|
||||
#include "HdmiConnectionMock.h"
|
||||
|
||||
using ndk::ScopedAStatus;
|
||||
|
||||
namespace android {
|
||||
|
@ -34,6 +33,7 @@ void HdmiConnectionMock::serviceDied(void* cookie) {
|
|||
ALOGE("HdmiConnectionMock died");
|
||||
auto hdmi = static_cast<HdmiConnectionMock*>(cookie);
|
||||
hdmi->mHdmiThreadRun = false;
|
||||
pthread_join(hdmi->mThreadId, NULL);
|
||||
}
|
||||
|
||||
ScopedAStatus HdmiConnectionMock::getPortInfo(std::vector<HdmiPortInfo>* _aidl_return) {
|
||||
|
@ -55,12 +55,15 @@ ScopedAStatus HdmiConnectionMock::isConnected(int32_t portId, bool* _aidl_return
|
|||
ScopedAStatus HdmiConnectionMock::setCallback(
|
||||
const std::shared_ptr<IHdmiConnectionCallback>& 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
|
||||
|
|
|
@ -41,7 +41,7 @@ using ::aidl::android::hardware::tv::hdmi::connection::Result;
|
|||
|
||||
struct HdmiConnectionMock : public BnHdmiConnection {
|
||||
HdmiConnectionMock();
|
||||
|
||||
~HdmiConnectionMock();
|
||||
::ndk::ScopedAStatus getPortInfo(std::vector<HdmiPortInfo>* _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);
|
||||
|
|
Loading…
Reference in a new issue