Back to C++20 standard!

Logging is worked (AdcOstreamLogger and AdcSPDLOGLogger classes)
This commit is contained in:
2024-11-14 18:33:07 +03:00
parent 05e0055193
commit 78a9e53d18
9 changed files with 334 additions and 196 deletions

View File

@@ -2,6 +2,7 @@
#include <memory>
#include <system_error>
#include <thread>
#include "adc_device_netmsg.h"
#include "adc_netserver.h"
@@ -105,11 +106,12 @@ namespace adc
{
template <typename IdentT = std::string>
class AdcDeviceNetServer : public AdcGenericNetServer<IdentT>
template <typename IdentT = std::string, interfaces::adc_logger_c LoggerT = utils::AdcOstreamLogger<char>>
class AdcDeviceNetServer : public AdcGenericNetServer<IdentT, LoggerT>
{
public:
using typename AdcGenericNetServer<IdentT>::server_ident_t;
using typename AdcGenericNetServer<IdentT, LoggerT>::server_ident_t;
using typename AdcGenericNetServer<IdentT, LoggerT>::logger_t;
// type for serialized data (attr/command ID, attr values etc...)
typedef std::vector<char> serialized_t;
@@ -232,13 +234,15 @@ public:
_recvTimeout(ctx.recvTimeout),
_sendTimeout(ctx.sendTimeout)
{
_serverPtr->logInfo("Create client session with ID = {} (addr = {})", _ident, (void*)this);
_serverPtr->logInfo("Create client session with ID = {} (addr = {}, thread = {})", _ident, (void*)this,
utils::AdcThisThreadId());
}
virtual ~Session()
{
_serverPtr->logInfo("Delete client session with ID = {} (addr = {})", _ident, (void*)this);
_serverPtr->logInfo("Delete client session with ID = {} (addr = {}, thread = {})", _ident, (void*)this,
utils::AdcThisThreadId());
}
netsession_ident_t ident() const
@@ -248,18 +252,22 @@ public:
void start()
{
_serverPtr->logInfo("Start client session with ID = {} (addr = {})", _ident, (void*)this);
static bool first_time = true;
if (first_time) {
_serverPtr->logInfo("Start client session with ID = {} (addr = {}, thread = {})", _ident, (void*)this,
utils::AdcThisThreadId());
first_time = false;
}
auto self(this->shared_from_this());
_netService.asyncReceive(
[self, this](netservice_t::async_callback_err_t ec, message_t msg) {
if (ec) {
// std::string str("asyncReceive operation completed with error: ");
// netservice_t::formatError(ec, str);
// _serverPtr->errorMessage(str);
_serverPtr->logError("asyncReceive operation completed with error: {}",
netservice_t::formattableError(ec));
_serverPtr->logError(
"asyncReceive operation completed with error: {} (session addr = {}, thread = {})",
netservice_t::formattableError(ec), (void*)this, utils::AdcThisThreadId());
stop();
} else {
auto msg_sptr = std::make_shared<message_t>(std::move(msg));
@@ -272,11 +280,9 @@ public:
*msg_sptr,
[self, msg_sptr, this](netservice_t::async_callback_err_t ec) {
if (ec) {
// std::string str("asyncSend operation completed with error: ");
// netservice_t::formatError(ec, str);
// _serverPtr->errorMessage(str);
_serverPtr->logError("asyncSend operation completed with error: {}",
netservice_t::formattableError(ec));
_serverPtr->logError(
"asyncSend operation completed with error: {} (session addr = {}, thread = {})",
netservice_t::formattableError(ec), (void*)this, utils::AdcThisThreadId());
stop();
} else {
start();
@@ -290,7 +296,8 @@ public:
void stop()
{
_serverPtr->logInfo("Stop client session with ID = {} (addr = {})", _ident, (void*)this);
_serverPtr->logInfo("Stop client session with ID = {} (addr = {}, thread = {})", _ident, (void*)this,
utils::AdcThisThreadId());
_netService.close();
}
@@ -391,8 +398,8 @@ public:
};
// using AdcGenericNetServer::AdcGenericNetServer;
AdcDeviceNetServer(const server_ident_t& id) : AdcGenericNetServer<IdentT>(id), _devices() {}
using AdcGenericNetServer<IdentT, LoggerT>::AdcGenericNetServer;
// AdcDeviceNetServer(const server_ident_t& id) : AdcGenericNetServer<IdentT>(id), _devices() {}
virtual ~AdcDeviceNetServer() = default;
@@ -406,6 +413,18 @@ public:
CmdIdDeserialT&& cmd_id_deser_func = {}) // deserializer of command ID
{
auto id = std::forward<IdSerialT>(id_ser_func)(dev_ptr->ident());
if constexpr (traits::formattable<serialized_t>) {
this->logInfo("Add ADC device with ID: {} (addr = {}, thread = {})", id, (void*)dev_ptr,
utils::AdcThisThreadId());
} else {
std::string s;
std::ranges::copy(id, std::back_inserter(s));
this->logInfo("Add ADC device with ID: {} (addr = {}, thread = {})", s, (void*)dev_ptr,
utils::AdcThisThreadId());
}
_devices.try_emplace(dev_ptr, dev_ptr, id, std::forward<AttrIdDeserialT>(attr_id_deser_func),
std::forward<CmdIdDeserialT>(cmd_id_deser_func));
@@ -415,7 +434,25 @@ public:
template <interfaces::adc_device_c DeviceT>
AdcDeviceNetServer& delDevice(DeviceT* dev_ptr)
{
_devices.erase(dev_ptr);
auto it = _devices.find(dev_ptr);
if (it == _devices.end()) {
this->logError("Invalid ADC device pointer ({})! It seems the device was not added!", (void*)dev_ptr);
return *this;
}
if constexpr (traits::formattable<serialized_t>) {
this->logInfo("Delete ADC device with ID: {} (addr = {}, thread = {})", it->ident(), (void*)dev_ptr,
utils::AdcThisThreadId());
} else {
std::string s;
std::ranges::copy(it->ident(), std::back_inserter(s));
this->logInfo("Delete ADC device with ID: {} (addr = {}, thread = {})", s, (void*)dev_ptr,
utils::AdcThisThreadId());
}
_devices.erase(it);
// _devices.erase(dev_ptr);
return *this;
}