Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iox-#2330 add notify systemd #2334

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
fe5015f
iox-#2330 Add libsystemd-dev to install dependencies
khromenokroman Aug 22, 2024
25155df
iox-#2330 Add systemd build option
khromenokroman Aug 22, 2024
e09617a
iox-#2330 Add conditional compilation for systemd support
khromenokroman Aug 22, 2024
76dd33f
iox-#2330 Rename listen_thread_watchdog to m_listen_thread_watchdog
khromenokroman Aug 22, 2024
485bfa4
iox-#2330 Improve thread management and error logging
khromenokroman Aug 23, 2024
d72b763
iox-#2330 Add early returns for watchdog error handling
khromenokroman Aug 23, 2024
07c89d9
iox-#2330 Refactor environment variable handling for 'INVOCATION_ID'
khromenokroman Aug 23, 2024
425db5e
iox-#2330 Refine systemd configuration for iceoryx_posh_roudi
khromenokroman Aug 23, 2024
952e91f
iox-#2330 Remove unnecessary dependency from GitHub action
khromenokroman Aug 23, 2024
7abf543
iox-#2330 Refactor systemd handling into a dedicated class
khromenokroman Aug 23, 2024
bc13c4b
iox-#2330 Add shutdown method to Systemd_service_handler
khromenokroman Aug 23, 2024
4aee645
iox-#2330 Refactor Systemd include with conditional compilation
khromenokroman Aug 24, 2024
864d7b1
iox-#2330 Refactor class names and method names for consistency
khromenokroman Aug 24, 2024
a5f4bb4
iox-#2330 Refactor systemd handler variable names
khromenokroman Aug 24, 2024
4b4651c
iox-#2330 Update changelog (text, reference)
khromenokroman Aug 24, 2024
3c334a6
iox-#2330 Add systemd support example to installation guide
khromenokroman Aug 24, 2024
8173252
iox-#2330 Add condition_variable to watchdog loop
khromenokroman Aug 24, 2024
efe3917
iox-#2330 Refactor environment variable retrieval
khromenokroman Aug 24, 2024
4ba2e9e
iox-#2330 Refactor SystemdServiceHandler for better readability
khromenokroman Aug 24, 2024
03d6f0d
iox-#2330 Refactor systemd notification handler
khromenokroman Aug 25, 2024
62ba7b0
iox-#2330 Refactor SDNotify signal handling
khromenokroman Aug 25, 2024
f72cc56
iox-#2330 Refactor systemd include for conditional compilation
khromenokroman Aug 25, 2024
92fa972
iox-#2330 Refactor service management class names
khromenokroman Aug 28, 2024
2defac8
iox-#2330 Add Ubuntu Systemd build job to CI
khromenokroman Aug 28, 2024
19f09c5
iox-#2330 test ci
khromenokroman Aug 28, 2024
ad57509
iox-#2330 test ci
khromenokroman Aug 28, 2024
b4e3db2
iox-#2330 Add dependency installation to build workflow
khromenokroman Aug 28, 2024
8b50b7b
iox-#2330 Add step to show systemd unit file in workflow
khromenokroman Aug 28, 2024
5abaede
iox-#2330 Update method to create systemd unit file
khromenokroman Aug 28, 2024
1d1b73b
iox-#2330 Add steps to manage test_iox with systemd
khromenokroman Aug 28, 2024
93a1ac9
iox-#2330 Update ExecStart path in systemd unit file
khromenokroman Aug 28, 2024
022d7fd
iox-#2330 Add systemctl status check in build workflow
khromenokroman Aug 28, 2024
5f5afa1
iox-#2330 Refactor build workflow to use systemd container
khromenokroman Aug 28, 2024
ef4bffd
iox-#2330 Refactor workflow to update package list before install
khromenokroman Aug 28, 2024
f73c9c6
iox-#2330 Refactor workflow to update package list before install
khromenokroman Aug 28, 2024
41b10a2
iox-#2330 Update systemd container image in workflow
khromenokroman Aug 28, 2024
ee418c3
iox-#2330 Add git to Build Systemd workflow
khromenokroman Aug 28, 2024
2914009
iox-#2330 Add dbus to Build Systemd workflow
khromenokroman Aug 28, 2024
402a626
iox-#2330 Refactor workflow to remove container usage
khromenokroman Aug 28, 2024
250b4e4
iox-#2330 Add sudo to commands in build_systemd.yaml
khromenokroman Aug 28, 2024
7d6d7e2
iox-#2330 Fix incorrect path in systemd unit file display step
khromenokroman Aug 28, 2024
d84998f
iox-#2330 Update ExecStart path and improve service start feedback
khromenokroman Aug 28, 2024
7ab593c
iox-#2330 Update systemd unit file to remove specific user
khromenokroman Aug 28, 2024
ab28d4f
iox-#2330 Add journal log display steps in build workflow
khromenokroman Aug 28, 2024
58c5feb
iox-#2330 Update build workflow with roudi start failure handling
khromenokroman Aug 28, 2024
f4cdef7
iox-#2330 Add systemd run checks to build workflow
khromenokroman Aug 29, 2024
e96b661
iox-#2330 Remove systemd build workflow and fix namespace typo
khromenokroman Aug 29, 2024
20793f5
iox-#2330 Refactor call to `iox_getenv_s` for type safety
khromenokroman Aug 29, 2024
ef310cb
iox-#2330 Refactor call to iox_getenv_s for type safety (rev.2)
khromenokroman Aug 29, 2024
a5f4534
Merge branch 'eclipse-iceoryx:main' into iox-#2330-add_notify_systemd
khromenokroman Sep 1, 2024
c9236aa
iox-#2330 Refactor ci
khromenokroman Sep 1, 2024
9775883
iox-#2330 Edit CMakeLists.txt
khromenokroman Sep 9, 2024
a60d701
iox-#2330 Edit CMakeLists.txt
khromenokroman Sep 9, 2024
ddce6b5
iox-#2330 Edit note-release
khromenokroman Sep 9, 2024
0921e43
iox-#2330 Sort bazel
khromenokroman Sep 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,22 @@ jobs:
uses: ./.github/actions/install-iceoryx-deps-and-clang
- run: ./tools/ci/build-test-ubuntu-bazel.sh

# Check run systemd
build-and-run-roudi-with-systemd-and-build-test-and-run-ubuntu:
# prevent stuck jobs consuming runners for 6 hours
timeout-minutes: 60
runs-on: ubuntu-latest
needs: pre-flight-check
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install iceoryx dependencies and clang-tidy
uses: ./.github/actions/install-iceoryx-deps-and-clang
- name: Build project and test and run unit test
run: sudo ./tools/ci/build-test-ubuntu-support-systemd-unit.sh
- name: Run integration test
run: sudo ./tools/ci/build-test-ubuntu-support-systemd-integrations.sh

coverage-and-docs:
# prevent stuck jobs consuming runners for 6 hours
timeout-minutes: 60
Expand Down
26 changes: 26 additions & 0 deletions doc/website/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,32 @@ The `CMakeLists.txt` from `iceoryx_meta` can be used to easily develop iceoryx w
Please take a look at the CMake file [build_options.cmake](../../../iceoryx_meta/build_options.cmake)
to get an overview of the available build options for enabling additional features.

If systemd support is enabled `-DUSE_SYSTEMD=ON`, the unit file may look like this:

````bash
#$ vim /usr/lib/systemd/system/test_iceoryx.service
[Unit]
Description=Test application roudi

[Service]
Type=notify
User=roma
RestartSec=10
Restart=always
ExecStart=/usr/bin/iox-roudi
TimeoutStartSec=10
WatchdogSec=5

[Install]
WantedBy=multi-user.target

````
Do not forget to do this after adding the unit file `systemctl daemon-reload`

Launch example `systemctl start test_iceoryx`

Example of a stop `systemctl stop test_iceoryx`

## Build with script

As an alternative, we provide a build-test script which we use to integrate iceoryx into our infrastructure.
Expand Down
2 changes: 2 additions & 0 deletions iceoryx_meta/build_options.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ option(TEST_WITH_HUGE_PAYLOAD "Build Tests which use payload bigger than 2GB" OF
option(TOML_CONFIG "TOML support for RouDi with dynamic configuration" ON)
option(IOX_EXPERIMENTAL_POSH "Export experimental posh features (no guarantees)" OFF)
option(IOX_REPRODUCIBLE_BUILD "Create reproducible builds by omit setting the build timestamp in the version header" ON)
option(USE_SYSTEMD "Build with systemd support" OFF)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # "Create compile_commands.json file"

Expand Down Expand Up @@ -97,4 +98,5 @@ function(show_config_options)
message(" TOML_CONFIG..........................: " ${TOML_CONFIG})
message(" IOX_EXPERIMENTAL_POSH................: " ${IOX_EXPERIMENTAL_POSH})
message(" IOX_REPRODUCIBLE_BUILD...............: " ${IOX_REPRODUCIBLE_BUILD})
message(" USE_SYSTEMD..........................: " ${USE_SYSTEMD})
endfunction()
14 changes: 13 additions & 1 deletion iceoryx_platform/cmake/IceoryxPackageHelper.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,11 @@ Macro(iox_add_executable)
target_compile_options(${IOX_TARGET} PRIVATE ${ICEORYX_CXX_FLAGS} ${ICEORYX_CXX_WARNINGS} ${ICEORYX_SANITIZER_FLAGS} ${ICEORYX_GRCOV_FLAGS})
endif()

if(USE_SYSTEMD AND ("${IOX_TARGET}" STREQUAL "posh_moduletests"))
target_compile_definitions(${IOX_TARGET} PRIVATE USE_SYSTEMD_TEST=1)
message(STATUS "[i] Configuring ${IOX_TARGET} with systemd support.")
endif ()
Comment on lines +240 to +243
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. Please look how it is done with IOX_EXPERIMENTAL_POSH_FLAG


if ( IOX_STACK_SIZE )
if(APPLE)
# @todo iox-#1287 not yet supported
Expand Down Expand Up @@ -340,7 +345,14 @@ Macro(iox_add_library)
target_include_directories(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_INCLUDES} PRIVATE ${IOX_PRIVATE_INCLUDES})

if ( LINUX )
target_link_libraries(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_LIBS_LINUX} PRIVATE ${IOX_PRIVATE_LIBS_LINUX})
if(USE_SYSTEMD AND ("${IOX_TARGET}" STREQUAL "iceoryx_posh_roudi"))
message(STATUS "[i] Configuring ${IOX_TARGET} with systemd support.")
target_compile_definitions(${IOX_TARGET} PRIVATE USE_SYSTEMD=1)
target_link_libraries(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_LIBS_LINUX} PRIVATE ${IOX_PRIVATE_LIBS_LINUX})
# target_link_libraries(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_LIBS_LINUX} PRIVATE ${IOX_PRIVATE_LIBS_LINUX} systemd)
else()
target_link_libraries(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_LIBS_LINUX} PRIVATE ${IOX_PRIVATE_LIBS_LINUX})
endif()
elseif ( APPLE )
target_link_libraries(${IOX_TARGET} PUBLIC ${IOX_PUBLIC_LIBS_APPLE} PRIVATE ${IOX_PRIVATE_LIBS_APPLE})
elseif ( QNX )
Expand Down
2 changes: 2 additions & 0 deletions iceoryx_posh/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ configure_file(
"IOX_MAX_SHM_SEGMENTS": "100",
"IOX_MAX_SUBSCRIBERS": "1024",
"IOX_MAX_SUBSCRIBERS_PER_PUBLISHER": "256",
"USE_SYSTEMD_FLAG": "false",
},
"//conditions:default": {
"IOX_COMMUNICATION_POLICY": "ManyToManyPolicy",
Expand Down Expand Up @@ -80,6 +81,7 @@ configure_file(
"IOX_MAX_SHM_SEGMENTS": "100",
"IOX_MAX_SUBSCRIBERS": "1024",
"IOX_MAX_SUBSCRIBERS_PER_PUBLISHER": "256",
"USE_SYSTEMD_FLAG": "false",
},
}),
)
Expand Down
6 changes: 6 additions & 0 deletions iceoryx_posh/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,11 @@ iox_add_library(
#
########## posh roudi lib ##########
#
set(SYSTEMD_LIB "")
if (USE_SYSTEMD_FLAG)
set(SYSTEMD_LIB systemd)
endif ()

iox_add_library(
NO_EXPORT
NO_PACKAGE_SETUP
Expand All @@ -198,6 +203,7 @@ iox_add_library(
source/capro
source/roudi
PRIVATE_LIBS_QNX socket
PRIVATE_LIBS_LINUX ${SYSTEMD_LIB}
BUILD_INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include
INSTALL_INTERFACE include/${PREFIX}
FILES
Expand Down
7 changes: 7 additions & 0 deletions iceoryx_posh/cmake/IceoryxPoshDeployment.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -144,5 +144,12 @@ else()
endif()
message(STATUS "[i] IOX_EXPERIMENTAL_POSH_FLAG: ${IOX_EXPERIMENTAL_POSH_FLAG}")

if(USE_SYSTEMD)
set(USE_SYSTEMD_FLAG true)
else()
set(USE_SYSTEMD_FLAG false)
endif()
message(STATUS "[i] USE_SYSTEMD_FLAG: ${USE_SYSTEMD_FLAG}")

message(STATUS "[i] <<<<<<<<<<<<<< End iceoryx_posh configuration: >>>>>>>>>>>>>>")

1 change: 1 addition & 0 deletions iceoryx_posh/cmake/iceoryx_posh_deployment.hpp.in
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ constexpr uint32_t IOX_MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY =
constexpr uint32_t IOX_MAX_REQUESTS_PROCESSED_SIMULTANEOUSLY = static_cast<uint32_t>(@IOX_MAX_REQUESTS_PROCESSED_SIMULTANEOUSLY@);
constexpr const char IOX_DEFAULT_RESOURCE_PREFIX[] = "@IOX_DEFAULT_RESOURCE_PREFIX@";
constexpr bool IOX_EXPERIMENTAL_POSH_FLAG = @IOX_EXPERIMENTAL_POSH_FLAG@;
constexpr bool USE_SYSTEMD_FLAG = @USE_SYSTEMD_FLAG@;
// clang-format on
} // namespace build
} // namespace iox
Expand Down
192 changes: 192 additions & 0 deletions iceoryx_posh/include/iceoryx_posh/internal/roudi/roudi.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#define IOX_POSH_ROUDI_ROUDI_MULTI_PROCESS_HPP

#include "iceoryx_platform/file.hpp"
#include "iceoryx_platform/stdlib.hpp"
#include "iceoryx_posh/iceoryx_posh_types.hpp"
#include "iceoryx_posh/internal/roudi/introspection/mempool_introspection.hpp"
#include "iceoryx_posh/internal/roudi/process_manager.hpp"
Expand All @@ -33,15 +34,206 @@
#include "iox/scope_guard.hpp"
#include "iox/smart_lock.hpp"


#include <condition_variable>
#include <cstdint>
#include <thread>

#ifdef USE_SYSTEMD
#include <systemd/sd-daemon.h>
#endif

#ifdef USE_SYSTEMD
namespace iox::roudi::service_management
{
class ServiceManagementSystemd;
} // namespace iox::roudi::service_management
using SendMessageServiceManagement = iox::roudi::service_management::ServiceManagementSystemd;
#else
namespace iox::roudi::service_management
{
class NoServiceManagementSystemd;
} // namespace iox::roudi::service_management
using SendMessageServiceManagement = iox::roudi::service_management::NoServiceManagementSystemd;
#endif
Comment on lines +46 to +58
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think a separate namespace is necessary. We kind of overdid it in iceoryx1 with namespaces. Since there are only three classes, it can stay in the roudi namespace.

I hope you don't hat me but I had an idea for a cleaner design. In general I always think of static polymorphism instead of dynamic polymorphism, since we cannot use dynamic polymorphism for data structure in the shared memory. But wat you did with the ServiceManagement base class reminded me of a nice pattern that could be used here. With that, all of this can be move to the ServiceManagement class. More further down.


namespace iox
{
namespace roudi
{
using namespace iox::units::duration_literals;

namespace service_management
{
/**
* @brief Interface class for systemd service handling
*
**/
class ServiceManagement
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, we have the policy that in general each class needs to be in its own hpp and cpp file. Can you please move this into iceoryx_posh/include/iceoryx_posh/roudi/service_management.hpp.

{
public:
virtual ~ServiceManagement() = default;
ServiceManagement(ServiceManagement const& other) = delete;
ServiceManagement(ServiceManagement&& other) = default;
ServiceManagement& operator=(ServiceManagement const& other) = delete;
ServiceManagement& operator=(ServiceManagement&& other) = default;

static constexpr const uint16_t SIZE_STRING = 4096; ///< maximum size of string // 2
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pleas be more precise. The size of what string is this?

static constexpr const uint8_t SIZE_THREAD_NAME = 15; ///< max size for thread name // 1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please just use ThreadName_t from iox/thread.hpp ... but I think this can even be completely removed. I have to have a closer look below but it might be that all of the thread handling can be replaced by our PeriodicTask.



virtual void processNotify() = 0; /// dbus signal handler
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make the functions noexcept

virtual void shutdown() = 0; /// Sets a shutdown flag
virtual bool setThreadNameHelper(iox::string<SIZE_THREAD_NAME>& threadName) = 0; /// Sets a thread name
virtual std::string getEnvironmentVariable(const char* const env_var) = 0; /// Get environment variable
virtual bool sendSDNotifySignalHelper(const std::string_view state) = 0; /// Send notify
Comment on lines +85 to +89
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do these functions need to be public, except for testing purposes?


protected:
ServiceManagement() = default;
};
Comment on lines +72 to +93
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we could use the factory method pattern to get to our concrete implementation. Together with the moving away from the abstract base class to just a virtual base class, this would also eliminate the need for the NoServiceManagementSystemd class, since the functions in this class would just have the dummy implementations from NoServiceManagementSystemd.

This class would then also just hast a static create method which would return an iox::unique_ptr<ServiceManagement>. In this static method, the ifdefs would be hidden and nicely encapsulated from the other code.


/**
* @brief Class to handle systemd service notifications
*
**/
class ServiceManagementSystemd final : public ServiceManagement
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please also move this to a separate hpp and cpp file.

{
private:
std::condition_variable watchdogNotifyCondition; ///< watch dog notification condition // 48
std::mutex watchdogMutex; ///< watch dog mutex // 40
std::thread m_listenThreadWatchdog; ///< thread that listens to systemd watchdog signals // 8
std::atomic_bool m_shutdown{false}; ///< indicates if service is being shutdown // 1

public:
ServiceManagementSystemd() = default;
ServiceManagementSystemd(ServiceManagementSystemd const& other) = delete;
ServiceManagementSystemd(ServiceManagementSystemd&& other) = delete;
ServiceManagementSystemd& operator=(ServiceManagementSystemd const& other) = delete;
ServiceManagementSystemd& operator=(ServiceManagementSystemd&& other) = delete;

/**
* @brief Destructor joins the listenThreadWatchdog if it is still joinable, to ensure a proper termination
**/
~ServiceManagementSystemd() final;

/**
* @brief Sets the shutdown flag to true, causing the systemd handler to stop.
**/
void shutdown() final;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please always use override for virtual methods.


/**
* @brief Fetch required environment variable as a string
* @param env_var Pointer to environment variable
* @return Environment variable as std::string
**/
std::string getEnvironmentVariable(const char* const env_var) final;

/**
* @brief Helper function to set thread name
* @param threadName Thread name to be set
* @return True if successfully set, otherwise false
**/
bool setThreadNameHelper(iox::string<SIZE_THREAD_NAME>& threadName) final;

/**
* @brief Helper function to send SDNotify signals
* @param state SDNotify state to be sent
* @return True if signal sending is successful, otherwise false
**/
#ifdef USE_SYSTEMD
bool sendSDNotifySignalHelper(const std::string_view state) final
{
auto result = IOX_POSIX_CALL(sd_notify)(0, state.data()).successReturnValue(1).evaluate();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general we abstract these calls away in the iceoryx_platform layer but since this is a small change and we do not know if we ever support something different that systemd, e.g. lauchd on macOS, this does not need to be moved to the platform layer. But in order to prepare this, could you please add a iox_sd_notify free function. It would look like this

#ifdef USE_SYSTEMD
int iox_sd_notify(int unset_environment, const char *state)
{
    return sd_notify(unset_environment, state);
}
#else
int iox_sd_notify(int unset_environment, const char *state)
{
    return true;
}
#endif

The sendSDNotifySignalHelper would then have just one implementation and no ifdef. This is also more in line with our other abstractions.

if (result.has_error())
{
IOX_LOG(ERROR,
"Failed to send " << state.data()
<< " signal. Error: " << result.get_error().getHumanReadableErrnum());
return false;
}
return true;
}
#else
bool sendSDNotifySignalHelper([[maybe_unused]] const std::string_view state) final
{
// empty implementation
return true;
}
#endif
/**
* @brief Function to manage the watchdog loop
**/
void watchdogLoopHelper();

/**
* @brief Method to process systemd notification logic
**/
void processNotify() final;
};

/**
* @brief Empty implementation handler for non-systemd systems
*
**/
class NoServiceManagementSystemd final : public ServiceManagement
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be removed when the ServiceManagement is not pure abstract.

{
public:
NoServiceManagementSystemd() = default;
NoServiceManagementSystemd(NoServiceManagementSystemd const& other) = delete;
NoServiceManagementSystemd(NoServiceManagementSystemd&& other) = default;
NoServiceManagementSystemd& operator=(NoServiceManagementSystemd const& other) = delete;
NoServiceManagementSystemd& operator=(NoServiceManagementSystemd&& other) = default;

/**
* @brief Empty implementation of destructor
**/
~NoServiceManagementSystemd() final = default;

/**
* @brief Empty implementation of processNotify
**/
void processNotify() final
{
// empty implementation
}

/**
* @brief Empty implementation of shutdown
**/
void shutdown() final
{
// empty implementation
}

/**
* @brief Empty implementation of get environment variable
**/
std::string getEnvironmentVariable([[maybe_unused]] const char* const env_var) final
{
// empty implementation
return "no implement";
}

/**
* @brief Empty implementation set thread name
**/
bool setThreadNameHelper([[maybe_unused]] iox::string<SIZE_THREAD_NAME>& threadName) final
{
// empty implementation
return true;
}

/**
* @brief Empty implementation send SDNotify signals
**/
bool sendSDNotifySignalHelper([[maybe_unused]] const std::string_view state) final
{
// empty implementation
return true;
}
};
} // namespace service_management

class RouDi
{
public:
Expand Down
Loading
Loading