Fulcrum/SrvMgr.cpp
2019-11-18 00:49:32 +02:00

67 lines
1.7 KiB
C++

#include "SrvMgr.h"
#include "Util.h"
#include "Servers.h"
#include <utility>
SrvMgr::SrvMgr(const QList<Options::Interface> & ifaces, QObject *parent)
: Mgr(parent), interfaces(ifaces)
{
}
SrvMgr::~SrvMgr()
{
Debug() << __FUNCTION__ ;
cleanup();
}
// will throw Exception on error from within TcpServer::tryStart
void SrvMgr::startup()
{
if (servers.isEmpty()) {
startServers();
} else {
Error() << __PRETTY_FUNCTION__ << " called with servers already active! FIXME!";
}
}
void SrvMgr::cleanup()
{
for (auto srv : servers) {
delete srv; // will wait for threads to finish
}
servers.clear();
}
// throw Exception on error
void SrvMgr::startServers()
{
Log() << "SrvMgr: starting " << interfaces.length() << " service(s) ...";
for (auto iface : interfaces) {
auto srv = new Server(iface.first, iface.second);
servers.push_back(srv); // save server in list unconditionally so we may delete later because tryStart may throw
srv->tryStart();
}
}
auto SrvMgr::stats() const -> Stats
{
Stats ret;
QVariantList serverList;
auto servers = this->servers; // copy
const int timeout = kDefaultTimeout / qMax(servers.size(), 1);
for (auto server : servers) {
using Pair = std::pair<QString, QVariant>;
auto result = Util::LambdaOnObjectNoThrow<Pair>(server, [server] {
return Pair(server->prettyName(), server->stats());
}, timeout); // <-- limited timeout just in case
if (result) {
QVariantMap m;
m[result->first] = result->second;
serverList.push_back(m);
}
}
ret["Servers"] = serverList;
return ret;
}