DevMgr: Add DeviceReattacher daemon plumbing

This is the plumbing for a periodic polling thread that tries
to reattach DA specs that failed to attach in the startup phase.
This commit is contained in:
2025-09-28 23:07:39 -04:00
parent 2be78401b5
commit 93103aa8d4
5 changed files with 124 additions and 0 deletions
+1
View File
@@ -25,6 +25,7 @@ add_library(smocore STATIC
# DeviceManager
deviceManager/deviceManager.cpp
deviceManager/deviceReattacher.cpp
deviceManager/deviceAttachmentPipeSpecParser.cpp
${LEX_OUTPUT}
${YACC_OUTPUT}
@@ -0,0 +1,68 @@
#include <config.h>
#include <iostream>
#include <functional>
#include <componentThread.h>
#include <deviceManager/deviceReattacher.h>
#include <deviceManager/deviceManager.h>
namespace smo {
namespace device {
DeviceReattacher::DeviceReattacher(
DeviceManager& parent, std::shared_ptr<ComponentThread> ioThread)
: parent(parent), ioThread(ioThread), shouldContinue(false),
timer(ioThread->getIoService())
{
}
void DeviceReattacher::start()
{
shouldContinue.store(true);
scheduleNextTimeout();
}
void DeviceReattacher::stop()
{
shouldContinue.store(false);
timer.cancel();
}
void DeviceReattacher::scheduleNextTimeout()
{
if (!shouldContinue.load()) {
return;
}
// Schedule the next timeout using the configured period
timer.expires_from_now(
boost::posix_time::milliseconds(
CONFIG_MRNTT_DEVMGR_REATTACHER_PERIOD_MS));
timer.async_wait(
std::bind(&DeviceReattacher::onTimeout, this, std::placeholders::_1));
}
void DeviceReattacher::onTimeout(const boost::system::error_code& error)
{
// Timer was cancelled, which is expected when stopping
if (error == boost::asio::error::operation_aborted) {
return;
}
if (error)
{
std::cerr << "DeviceReattacher: Timer error: " << error.message()
<< std::endl;
return;
}
if (!shouldContinue.load()) {
return;
}
// Schedule the next timeout
scheduleNextTimeout();
}
} // namespace device
} // namespace smo
@@ -0,0 +1,44 @@
#ifndef DEVICEREATTACHER_H
#define DEVICEREATTACHER_H
#include <atomic>
#include <memory>
#include <boost/asio.hpp>
namespace smo {
class ComponentThread;
namespace device {
class DeviceManager;
class DeviceReattacher
{
public:
DeviceReattacher(
DeviceManager& parent, std::shared_ptr<ComponentThread> ioThread);
~DeviceReattacher() = default;
// Non-copyable
DeviceReattacher(const DeviceReattacher&) = delete;
DeviceReattacher& operator=(const DeviceReattacher&) = delete;
// Control methods
void start();
void stop();
private:
void scheduleNextTimeout();
void onTimeout(const boost::system::error_code& error);
DeviceManager &parent;
std::shared_ptr<ComponentThread> ioThread;
std::atomic<bool> shouldContinue;
boost::asio::deadline_timer timer;
};
} // namespace device
} // namespace smo
#endif // DEVICEREATTACHER_H