~aleteoryx/muditaos

e0da78c9be650e78f1d1232ac477991dcf39e2d2 — Alek Rudnik 4 years ago 2f8cda2
[EGD-8193] Proper system shutdown durign update

Made sure all system is deinitialized during update.
Currently there are two exceptions: service eink and service
desktop. There are some issues with them but it should be fixed
in the near future
M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +37 -33
@@ 45,17 45,6 @@ namespace sys

    namespace state
    {
        namespace update
        {
            static constexpr std::array whitelist = {service::name::service_desktop,
                                                     service::name::evt_manager,
                                                     service::name::gui,
                                                     service::name::db,
                                                     service::name::eink,
                                                     service::name::appmgr,
                                                     service::name::cellular};
        }

        namespace restore
        {
            static constexpr std::array whitelist = {service::name::service_desktop,


@@ 71,6 60,14 @@ namespace sys
            static constexpr std::array whitelist = {service::name::evt_manager, service::name::cellular};
        }

        namespace update
        {
            static constexpr std::array whitelist = {service::name::evt_manager,
                                                     service::name::cellular,
                                                     service::name::eink,
                                                     service::name::service_desktop};
        }

        template <typename T> static bool isOnWhitelist(const T &list, const std::string &serviceName)
        {
            return std::find(std::begin(list), std::end(list), serviceName) != std::end(list);


@@ 393,6 390,7 @@ namespace sys
                ++service;
            }
            else {
                LOG_DEBUG("RequestServiceClose %s", (*service)->GetName().c_str());
                if (!RequestServiceClose((*service)->GetName(), this)) {
                    LOG_ERROR("Service %s did not respond -> to kill", (*service)->GetName().c_str());
                    kill(*service);


@@ 475,6 473,9 @@ namespace sys
            readyForCloseRegister.push_back(service->GetName());
        }

        // stored to be used later in CloseServices
        this->closeReason = closeReason;

        servicesPreShutdownRoutineTimeout = sys::TimerFactory::createPeriodicTimer(
            this, "servicesPreShutdownRoutine", preShutdownRoutineTimeout, [this](sys::Timer &) { CloseServices(); });
        servicesPreShutdownRoutineTimeout.start();


@@ 556,17 557,14 @@ namespace sys
                case Code::CloseSystem:
                    CloseSystemHandler(data->closeReason);
                    break;
                case Code::Update:
                    UpdateSystemHandler();
                    break;
                case Code::Restore:
                    RestoreSystemHandler();
                    break;
                case Code::Reboot:
                    RebootHandler(State::Reboot);
                    RebootHandler();
                    break;
                case Code::RebootToUpdate:
                    RebootHandler(State::RebootToUpdate, data->updateReason);
                    RebootToUpdateHandler(data->updateReason);
                    break;
                case Code::RebootToUsbMscMode:
                    RebootToUsbMscModeHandler(State::RebootToUsbMscMode);


@@ 727,8 725,24 @@ namespace sys
        // All delayed messages will be ignored
        readyForCloseRegister.clear();

        DestroyServices(sys::state::regularClose::whitelist);
        set(State::Shutdown);
        switch (closeReason) {
        case CloseReason::RegularPowerDown:
        case CloseReason::FactoryReset:
        case CloseReason::SystemBrownout:
        case CloseReason::LowBattery:
        case CloseReason::RebootToUsbMscMode:
            DestroyServices(sys::state::regularClose::whitelist);
            set(State::Shutdown);
            break;
        case CloseReason::Reboot:
            DestroyServices(sys::state::regularClose::whitelist);
            set(State::Reboot);
            break;
        case CloseReason::RebootToUpdate:
            DestroyServices(sys::state::update::whitelist);
            set(State::RebootToUpdate);
            break;
        }
    }

    void SystemManagerCommon::RestoreSystemHandler()


@@ 745,25 759,15 @@ namespace sys
        LOG_INFO("entered restore state");
    }

    void SystemManagerCommon::UpdateSystemHandler()
    void SystemManagerCommon::RebootHandler()
    {
        LOG_DEBUG("Starting system update procedure...");

        // We are going to remove services in reversed order of creation
        CriticalSection::Enter();
        std::reverse(servicesList.begin(), servicesList.end());
        CriticalSection::Exit();

        DestroyServices(sys::state::update::whitelist);
        CloseSystemHandler(CloseReason::Reboot);
    }

    void SystemManagerCommon::RebootHandler(State state, std::optional<UpdateReason> updateReason)
    void SystemManagerCommon::RebootToUpdateHandler(UpdateReason updateReason)
    {
        CloseSystemHandler(CloseReason::Reboot);
        set(state);
        if (updateReason) {
            this->updateReason = updateReason.value();
        }
        CloseSystemHandler(CloseReason::RebootToUpdate);
        this->updateReason = updateReason;
    }

    void SystemManagerCommon::RebootToUsbMscModeHandler(State newState)

M module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp => module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp +4 -4
@@ 39,7 39,6 @@ namespace sys
    enum class Code
    {
        CloseSystem,
        Update,
        Restore,
        Reboot,
        RebootToUpdate,


@@ 179,11 178,11 @@ namespace sys

        void readyToCloseHandler(Message *msg);

        void UpdateSystemHandler();

        void RestoreSystemHandler();

        void RebootHandler(State state, std::optional<UpdateReason> updateReason = std::nullopt);
        void RebootHandler();

        void RebootToUpdateHandler(UpdateReason updateReason);

        void RebootToUsbMscModeHandler(State newState);



@@ 194,6 193,7 @@ namespace sys

        bool cpuStatisticsTimerInit{false};

        CloseReason closeReason{CloseReason::RegularPowerDown};
        UpdateReason updateReason{UpdateReason::Update};
        std::vector<std::unique_ptr<BaseServiceCreator>> systemServiceCreators;
        sys::TimerHandle freqTimer;

M module-sys/common/include/system/Common.hpp => module-sys/common/include/system/Common.hpp +1 -1
@@ 1,4 1,4 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once