From 2f0f8fd52cb4378a2f603f0a4e091df14463d957 Mon Sep 17 00:00:00 2001 From: Mateusz Date: Wed, 28 Aug 2019 08:56:41 +0200 Subject: [PATCH] Fix: SystemClose procedure --- module-services/service-eink/ServiceEink.cpp | 2 +- module-sys/SystemManager/SystemManager.cpp | 42 +++++++++----------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/module-services/service-eink/ServiceEink.cpp b/module-services/service-eink/ServiceEink.cpp index de6ae5c6e..0ef2978db 100644 --- a/module-services/service-eink/ServiceEink.cpp +++ b/module-services/service-eink/ServiceEink.cpp @@ -151,7 +151,7 @@ sys::Message_t ServiceEink::DataReceivedHandler(sys::DataMessage* msgl,sys::Resp // Invoked when timer ticked void ServiceEink::TickHandler(uint32_t id) { - LOG_INFO("[ServiceEink] Powre down eink after 3 seconds"); + LOG_INFO("[ServiceEink] Power down eink after 3 seconds"); EinkPowerOff(); } diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index be7468160..dafc17b6a 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -198,33 +198,27 @@ namespace sys DeleteTimer(pingPongTimerID); - for(auto const &w: servicesList){ - - // Sysmgr stores list of all active services but some of them are under control of parent services. - // Parent services ought to manage lifetime of child services hence we are sending close messages only to parent services. - if(w->parent != ""){ - continue; - } - - auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::Exit),w->GetName(),this,5000); - - if(ret.first != ReturnCodes::Success){ - //no response to exit message, - LogOutput::Output(w->GetName() + " failed to response to exit message"); - exit(1); - } - - auto serv = std::find_if(servicesList.begin(),servicesList.end(),[&](std::shared_ptrconst &s) { return s->GetName() == w->GetName(); }); - if(serv == servicesList.end()){ - exit(1); - } - - } - + // We are going to remove services in reversed order of creation CriticalSection::Enter(); - servicesList.clear(); + std::reverse(servicesList.begin(),servicesList.end()); CriticalSection::Exit(); + servicesList.erase( std::remove_if(servicesList.begin(), servicesList.end(), [&](auto& obj){ + // Sysmgr stores list of all active services but some of them are under control of parent services. + // Parent services ought to manage lifetime of child services hence we are sending close messages only to parent services. + if(obj->parent == ""){ + auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::Exit),obj->GetName(),this,5000); + + if(ret.first != ReturnCodes::Success){ + //no response to exit message, + LogOutput::Output(obj->GetName() + " failed to response to exit message"); + exit(1); + } + } + return true; + } + ), servicesList.end() ); + if(servicesList.size() == 0){ enableRunLoop = false; }