Skip to content

Commit

Permalink
broker: using std::visit
Browse files Browse the repository at this point in the history
  • Loading branch information
bcsanches committed Jan 6, 2025
1 parent cbfb51a commit 5e56e4d
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 29 deletions.
24 changes: 13 additions & 11 deletions src/Broker/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,19 @@ constexpr auto BUILD_NUM = DCCLITE_VERSION;

static std::atomic_flag g_fExitRequested;

class NullEventTarget: public dcclite::broker::EventHub::IEventTarget
{
public:
//empty
};

class QuitEvent: public dcclite::broker::EventHub::IEvent
{
private:
class NullEventTarget: public dcclite::broker::EventHub::IEventTarget
{
//empty
};

static NullEventTarget g_clTarget;

public:
QuitEvent(dcclite::broker::EventHub::IEventTarget &target) :
IEvent{ target }
QuitEvent() :
IEvent{ std::ref(g_clTarget)}
{
//empty
}
Expand All @@ -49,14 +51,14 @@ class QuitEvent: public dcclite::broker::EventHub::IEvent
}
};

QuitEvent::NullEventTarget QuitEvent::g_clTarget;

static bool ConsoleCtrlHandler(dcclite::ConsoleEvent event)
{
g_fExitRequested.test_and_set(std::memory_order_relaxed);

static NullEventTarget g_NullTarget;

//wake up main thread if it is sitting waiting for events...
dcclite::broker::EventHub::PostEvent<QuitEvent>(std::ref(g_NullTarget));
dcclite::broker::EventHub::PostEvent<QuitEvent>();

dcclite::Log::Info("[Main] CTRL+C detected, exiting...");

Expand Down
32 changes: 22 additions & 10 deletions src/BrokerLib/dcc/NetworkDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -703,7 +703,6 @@ namespace dcclite::broker
//
//


void NetworkDevice::Decoder_OnChangeStateRequest(const Decoder &decoder) noexcept
{
if (auto *onlineState = std::get_if<OnlineState>(&m_vState))
Expand Down Expand Up @@ -839,29 +838,42 @@ namespace dcclite::broker
return true;
}

void NetworkDevice::OnPacket(dcclite::Packet &packet, const dcclite::Clock::TimePoint_t time, const dcclite::MsgTypes msgType, const dcclite::NetworkAddress remoteAddress, const dcclite::Guid remoteConfigToken)
struct OnPacketImpl
{
if (!m_pclCurrentState)
void operator()(std::monostate &nullState, dcclite::RName devName, dcclite::Packet &packet, const dcclite::Clock::TimePoint_t time, const dcclite::MsgTypes msgType, const dcclite::NetworkAddress remoteAddress, const dcclite::Guid remoteConfigToken)
{
dcclite::Log::Error("[Device::{}] [OnPacket] Cannot process packet on Offline mode, packet: {}", this->GetName(), dcclite::MsgName(msgType));
dcclite::Log::Error("[Device::{}] [OnPacket] Cannot process packet on Offline mode, packet: {}", devName, dcclite::MsgName(msgType));
}

return;
}
#if 1
template <typename T>
void operator()(T &state, dcclite::RName devName, dcclite::Packet &packet, const dcclite::Clock::TimePoint_t time, const dcclite::MsgTypes msgType, const dcclite::NetworkAddress remoteAddress, const dcclite::Guid remoteConfigToken)
{
state.OnPacket(packet, time, msgType, remoteAddress, remoteConfigToken);
}
#endif
};

m_pclCurrentState->OnPacket(packet, time, msgType, remoteAddress, remoteConfigToken);
void NetworkDevice::OnPacket(dcclite::Packet &packet, const dcclite::Clock::TimePoint_t time, const dcclite::MsgTypes msgType, const dcclite::NetworkAddress remoteAddress, const dcclite::Guid remoteConfigToken)
{
std::visit([name = this->GetName(), &packet, time, msgType, remoteAddress, remoteConfigToken](auto &s)
{
OnPacketImpl impl;
impl(s, name, packet, time, msgType, remoteAddress, remoteConfigToken);
},
m_vState
);
}

void NetworkDevice::ClearState()
{
m_vState = std::monostate{};
m_pclCurrentState = nullptr;
m_vState = std::monostate{};
}

template <typename T, class... Args>
void NetworkDevice::SetState(Args&&...args)
{
m_vState.emplace<T>(*this, args...);
m_pclCurrentState = &std::get<T>(m_vState);
}

void NetworkDevice::GotoSyncState()
Expand Down
17 changes: 9 additions & 8 deletions src/BrokerLib/dcc/NetworkDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,13 @@ namespace dcclite::broker
//
//
//Connection status
Status m_kStatus = Status::OFFLINE;
Status m_kStatus = Status::OFFLINE;

friend struct OnPacketImpl;

struct State
{
virtual void OnPacket(
void OnPacket(
dcclite::Packet &packet,
const dcclite::Clock::TimePoint_t time,
const dcclite::MsgTypes msgType,
Expand Down Expand Up @@ -215,15 +217,15 @@ namespace dcclite::broker

Thinker m_clTimeoutThinker;

ConfigState(NetworkDevice &self, const dcclite::Clock::TimePoint_t time);
ConfigState(NetworkDevice &self, const dcclite::Clock::TimePoint_t time);

void OnPacket(
dcclite::Packet &packet,
const dcclite::Clock::TimePoint_t time,
const dcclite::MsgTypes msgType,
const dcclite::NetworkAddress remoteAddress,
const dcclite::Guid remoteConfigToken
) override;
);

[[nodiscard]]
const char *GetName() const override { return "ConfigState"; }
Expand Down Expand Up @@ -262,7 +264,7 @@ namespace dcclite::broker
const dcclite::MsgTypes msgType,
const dcclite::NetworkAddress remoteAddress,
const dcclite::Guid remoteConfigToken
) override;
);

[[nodiscard]] const char *GetName() const override { return "SyncState"; }

Expand All @@ -282,7 +284,7 @@ namespace dcclite::broker
const dcclite::MsgTypes msgType,
const dcclite::NetworkAddress remoteAddress,
const dcclite::Guid remoteConfigToken
) override;
);

[[nodiscard]] const char *GetName() const override { return "OnlineState"; }

Expand Down Expand Up @@ -325,8 +327,7 @@ namespace dcclite::broker
//
//Connection state

std::variant< std::monostate, ConfigState, SyncState, OnlineState> m_vState;
State *m_pclCurrentState = nullptr;
std::variant< std::monostate, ConfigState, SyncState, OnlineState> m_vState;

TimeoutController m_clTimeoutController;

Expand Down
13 changes: 13 additions & 0 deletions src/BrokerLib/sys/EventHub.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

#include <Clock.h>

#include "Log.h"

#define DCCLITE_EVENT_HUB_INTERNAL_POOL

namespace dcclite::broker
Expand Down Expand Up @@ -91,6 +93,17 @@ namespace dcclite::broker
{
ptr = std::make_unique<T>(std::forward<Args>(args)...);
}
#ifdef DCCLITE_DEBUG
catch (std::bad_alloc &)
{
dcclite::Log::Warn("[EventHub::PostEvent] Alloc failed, are you debugging??");

detail::Unlock();

//ignore it.. drop the event...
return;
}
#endif
catch (...)
{
detail::Unlock();
Expand Down
2 changes: 2 additions & 0 deletions src/LitePanel/LitePanelLib/Panel.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include "TileMap.h"

#include <string>

namespace LitePanel
{
class RailObject;
Expand Down

0 comments on commit 5e56e4d

Please sign in to comment.