livoxGen1🐛 Call stop() on all producers before deleting in _exit
This commit is contained in:
@@ -14,7 +14,47 @@ namespace smo::stim_buff::lcamera_buff {
|
||||
const SmoCallbacks *lcameraBuffSmoHooksPtr = nullptr;
|
||||
SmoThreadingModelDesc lcameraBuffThreadingModelDesc;
|
||||
LcameraDevDllState lcameraDevDll;
|
||||
std::vector<std::shared_ptr<YuvStimProducer>> attachedStimulusProducers;
|
||||
std::vector<std::shared_ptr<YuvStimProducer>> managedStimulusProducers;
|
||||
|
||||
void addManagedStimulusProducer(
|
||||
const std::shared_ptr<YuvStimProducer>& producer)
|
||||
{
|
||||
managedStimulusProducers.push_back(producer);
|
||||
producer->start();
|
||||
}
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<void> removeManagedStimulusProducerIfUnused(
|
||||
const std::shared_ptr<YuvStimProducer>& producer)
|
||||
{
|
||||
if (!producer) {
|
||||
co_return;
|
||||
}
|
||||
|
||||
if (!producer->attachedStimulusBuffers.empty()) {
|
||||
co_return;
|
||||
}
|
||||
|
||||
producer->stop();
|
||||
|
||||
managedStimulusProducers.erase(
|
||||
std::remove_if(
|
||||
managedStimulusProducers.begin(),
|
||||
managedStimulusProducers.end(),
|
||||
[&producer](const std::shared_ptr<YuvStimProducer>& candidate)
|
||||
{
|
||||
return candidate == producer;
|
||||
}),
|
||||
managedStimulusProducers.end());
|
||||
|
||||
const std::shared_ptr<lcamera_dev::CameraSession> deviceSession =
|
||||
producer->deviceSession;
|
||||
|
||||
if (deviceSession) {
|
||||
co_await (*lcameraDevDll.lcameraDev_releaseDeviceCReq)(deviceSession);
|
||||
}
|
||||
|
||||
producer->deviceSession.reset();
|
||||
}
|
||||
|
||||
void LcameraDevDllState::DlCloser::operator()(void *handle)
|
||||
{
|
||||
@@ -37,7 +77,7 @@ std::shared_ptr<YuvStimProducer> findStimProducerByCameraId(
|
||||
const std::string& resolvedCameraId)
|
||||
{
|
||||
for (const std::shared_ptr<YuvStimProducer>& producer :
|
||||
attachedStimulusProducers)
|
||||
managedStimulusProducers)
|
||||
{
|
||||
assert(producer != nullptr);
|
||||
if (producer->resolvedCameraId == resolvedCameraId) {
|
||||
@@ -83,6 +123,16 @@ bool validateAttachRequest(
|
||||
|
||||
namespace {
|
||||
|
||||
void stopAllManagedProducersBeforeFinalize()
|
||||
{
|
||||
for (const std::shared_ptr<YuvStimProducer>& producer :
|
||||
managedStimulusProducers)
|
||||
{
|
||||
assert(producer != nullptr);
|
||||
producer->stop();
|
||||
}
|
||||
}
|
||||
|
||||
void loadLcameraDevSymbols()
|
||||
{
|
||||
lcameraDevDll.lcameraDev_main = reinterpret_cast<lcameraDev_mainFn *>(
|
||||
@@ -171,7 +221,7 @@ attachByCreatingProducer(
|
||||
parsedParams,
|
||||
configuredMode);
|
||||
|
||||
attachedStimulusProducers.push_back(producer);
|
||||
addManagedStimulusProducer(producer);
|
||||
|
||||
co_return co_await attachChannelBufferToProducer(desc, producer);
|
||||
}
|
||||
@@ -212,14 +262,8 @@ sscl::co::ViralNonPostingInvoker<int> lcameraBuff_initializeCInd()
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<int> lcameraBuff_finalizeCInd()
|
||||
{
|
||||
for (const std::shared_ptr<YuvStimProducer>& producer :
|
||||
attachedStimulusProducers)
|
||||
{
|
||||
assert(producer != nullptr);
|
||||
producer->deviceSession.reset();
|
||||
}
|
||||
|
||||
attachedStimulusProducers.clear();
|
||||
stopAllManagedProducersBeforeFinalize();
|
||||
managedStimulusProducers.clear();
|
||||
|
||||
if (lcameraDevDll.lcameraDev_exit) {
|
||||
(*lcameraDevDll.lcameraDev_exit)();
|
||||
@@ -284,26 +328,11 @@ lcameraBuff_detachDeviceCReq(
|
||||
|
||||
producer->destroyAttachedStimulusBuffer(stimBuffer);
|
||||
|
||||
const std::shared_ptr<lcamera_dev::CameraSession> deviceSession =
|
||||
producer->deviceSession;
|
||||
|
||||
co_await (*lcameraDevDll.lcameraDev_releaseDeviceCReq)(deviceSession);
|
||||
|
||||
if (!producer->attachedStimulusBuffers.empty()) {
|
||||
co_return StimBuffDeviceOpResult{true, desc};
|
||||
}
|
||||
|
||||
attachedStimulusProducers.erase(
|
||||
std::remove_if(
|
||||
attachedStimulusProducers.begin(),
|
||||
attachedStimulusProducers.end(),
|
||||
[&producer](const std::shared_ptr<YuvStimProducer>& candidate)
|
||||
{
|
||||
return candidate == producer;
|
||||
}),
|
||||
attachedStimulusProducers.end());
|
||||
|
||||
producer->deviceSession.reset();
|
||||
co_await removeManagedStimulusProducerIfUnused(producer);
|
||||
|
||||
co_return StimBuffDeviceOpResult{true, desc};
|
||||
}
|
||||
|
||||
@@ -33,7 +33,13 @@ struct LcameraDevDllState
|
||||
extern const SmoCallbacks *lcameraBuffSmoHooksPtr;
|
||||
extern SmoThreadingModelDesc lcameraBuffThreadingModelDesc;
|
||||
extern LcameraDevDllState lcameraDevDll;
|
||||
extern std::vector<std::shared_ptr<YuvStimProducer>> attachedStimulusProducers;
|
||||
extern std::vector<std::shared_ptr<YuvStimProducer>> managedStimulusProducers;
|
||||
|
||||
void addManagedStimulusProducer(
|
||||
const std::shared_ptr<YuvStimProducer>& producer);
|
||||
|
||||
sscl::co::ViralNonPostingInvoker<void> removeManagedStimulusProducerIfUnused(
|
||||
const std::shared_ptr<YuvStimProducer>& producer);
|
||||
|
||||
std::shared_ptr<YuvStimProducer> findStimProducerByCameraId(
|
||||
const std::string& resolvedCameraId);
|
||||
|
||||
@@ -235,10 +235,10 @@ TEST_F(LcameraBuffConfigureHilTest, AttachThreeYuvChannelsWithOptPlanar480p)
|
||||
++expectedBufferCount;
|
||||
|
||||
ASSERT_EQ(
|
||||
smo::stim_buff::lcamera_buff::attachedStimulusProducers.size(),
|
||||
smo::stim_buff::lcamera_buff::managedStimulusProducers.size(),
|
||||
1u);
|
||||
producer = smo::stim_buff::lcamera_buff
|
||||
::attachedStimulusProducers.front();
|
||||
::managedStimulusProducers.front();
|
||||
ASSERT_TRUE(producer != nullptr);
|
||||
EXPECT_EQ(
|
||||
producer->attachedStimulusBuffers.size(),
|
||||
|
||||
Reference in New Issue
Block a user