// Copyright (c) 2019 by Robert Bosch GmbH. All rights reserved.// Copyright (c) 2021 by Apex.AI Inc. All rights reserved.//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.//// SPDX-License-Identifier: Apache-2.0#ifndef IOX_POSH_ROUDI_ROUDI_MULTI_PROCESS_HPP#define IOX_POSH_ROUDI_ROUDI_MULTI_PROCESS_HPP#include"iceoryx_posh/iceoryx_posh_types.hpp"#include"iceoryx_posh/internal/capro/capro_message.hpp"#include"iceoryx_posh/internal/roudi/introspection/mempool_introspection.hpp"#include"iceoryx_posh/internal/roudi/process_manager.hpp"#include"iceoryx_posh/internal/runtime/ipc_interface_creator.hpp"#include"iceoryx_posh/mepoo/mepoo_config.hpp"#include"iceoryx_posh/roudi/memory/roudi_memory_interface.hpp"#include"iceoryx_posh/roudi/memory/roudi_memory_manager.hpp"#include"iceoryx_posh/roudi/roudi_app.hpp"#include"iceoryx_utils/cxx/generic_raii.hpp"#include"iceoryx_utils/internal/concurrent/smart_lock.hpp"#include"iceoryx_utils/internal/relocatable_pointer/relative_pointer.hpp"#include"iceoryx_utils/platform/file.hpp"#include"iceoryx_utils/posix_wrapper/posix_access_rights.hpp"#include<cstdint>#include<cstdio>#include<thread>namespaceiox{namespaceroudi{usingnamespaceiox::units::duration_literals;classRouDi{public:enumclassRuntimeMessagesThreadStart{IMMEDIATE,DEFER_START};structRoudiStartupParameters{RoudiStartupParameters(constroudi::MonitoringModemonitoringMode=roudi::MonitoringMode::ON,constboolkillProcessesInDestructor=true,constRuntimeMessagesThreadStartRuntimeMessagesThreadStart=RuntimeMessagesThreadStart::IMMEDIATE,constversion::CompatibilityCheckLevelcompatibilityCheckLevel=version::CompatibilityCheckLevel::PATCH,constunits::DurationprocessKillDelay=roudi::PROCESS_DEFAULT_KILL_DELAY)noexcept:m_monitoringMode(monitoringMode),m_killProcessesInDestructor(killProcessesInDestructor),m_runtimesMessagesThreadStart(RuntimeMessagesThreadStart),m_compatibilityCheckLevel(compatibilityCheckLevel),m_processKillDelay(processKillDelay){}constroudi::MonitoringModem_monitoringMode;constboolm_killProcessesInDestructor;constRuntimeMessagesThreadStartm_runtimesMessagesThreadStart;constversion::CompatibilityCheckLevelm_compatibilityCheckLevel;constunits::Durationm_processKillDelay;};RouDi&operator=(constRouDi&other)=delete;RouDi(constRouDi&other)=delete;RouDi(RouDiMemoryInterface&roudiMemoryInteface,PortManager&portManager,RoudiStartupParametersroudiStartupParameters);virtual~RouDi();protected:voidstartProcessRuntimeMessagesThread();voidshutdown();virtualvoidprocessMessage(construntime::IpcMessage&message,constiox::runtime::IpcMessageType&cmd,constRuntimeName_t&runtimeName);virtualvoidcyclicUpdateHook();voidIpcMessageErrorHandler();version::VersionInfoparseRegisterMessage(construntime::IpcMessage&message,uint32_t&pid,uid_t&userId,int64_t&transmissionTimestamp);voidregisterProcess(constRuntimeName_t&name,constuint32_tpid,constposix::PosixUseruser,constint64_ttransmissionTimestamp,constuint64_tsessionId,constversion::VersionInfo&versionInfo);staticuint64_tgetUniqueSessionIdForProcess();private:voidprocessRuntimeMessages();voidmonitorAndDiscoveryUpdate();cxx::GenericRAIIm_unregisterRelativePtr{[]{},[]{rp::BaseRelativePointer::unregisterAll();}};boolm_killProcessesInDestructor;std::atomic_boolm_runMonitoringAndDiscoveryThread;std::atomic_boolm_runHandleRuntimeMessageThread;constunits::Durationm_runtimeMessagesThreadTimeout{100_ms};protected:RouDiMemoryInterface*m_roudiMemoryInterface{nullptr};cxx::GenericRAIIm_roudiMemoryManagerCleaner{[](){},[this](){if(this->m_roudiMemoryInterface->destroyMemory().has_error()){LogWarn()<<"unable to cleanup roudi memory interface";};}};PortManager*m_portManager{nullptr};concurrent::smart_lock<ProcessManager>m_prcMgr;private:std::threadm_monitoringAndDiscoveryThread;std::threadm_handleRuntimeMessageThread;protected:ProcessIntrospectionTypem_processIntrospection;MemPoolIntrospectionTypem_mempoolIntrospection;private:roudi::MonitoringModem_monitoringMode{roudi::MonitoringMode::ON};units::Durationm_processKillDelay;};}// namespace roudi}// namespace iox#endif // IOX_POSH_ROUDI_ROUDI_MULTI_PROCESS_HPP