1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
// Copyright (c) 2015-2015 Josh Blum
// SPDX-License-Identifier: BSL-1.0
#include "LogForwarding.hpp"
#include "SoapyRemoteDefs.hpp"
#include "SoapyRPCPacker.hpp"
#include <SoapySDR/Logger.hpp>
#include <mutex>
#include <set>
/***********************************************************************
* socket subscribers for log forwarding
**********************************************************************/
static std::mutex subscribersMutex;
static std::set<SoapyRPCSocket *> subscribers;
/***********************************************************************
* custom log handling
**********************************************************************/
static void handleLogMessage(const SoapySDRLogLevel logLevel, const char *message)
{
std::string strMessage(message);
std::lock_guard<std::mutex> lock(subscribersMutex);
for (auto sock : subscribers)
{
try
{
SoapyRPCPacker packer(*sock);
packer & char(logLevel);
packer & strMessage;
packer();
}
catch (...)
{
//ignored
}
}
}
/***********************************************************************
* subscriber reregistration entry points
**********************************************************************/
SoapyLogForwarder::SoapyLogForwarder(SoapyRPCSocket &sock):
_sock(sock)
{
std::lock_guard<std::mutex> lock(subscribersMutex);
subscribers.insert(&_sock);
//register the log handler, its safe to re-register every time
SoapySDR::registerLogHandler(&handleLogMessage);
}
SoapyLogForwarder::~SoapyLogForwarder(void)
{
std::lock_guard<std::mutex> lock(subscribersMutex);
subscribers.erase(&_sock);
}
|