From 8d12b908b60bb590763d68260a533f1382054387 Mon Sep 17 00:00:00 2001 From: Dennis Klein Date: Tue, 30 Jul 2019 19:36:13 +0200 Subject: [PATCH] SDK: Implement helper to find most recent running DDS session --- fairmq/sdk/DDSSession.cxx | 51 +++++++++++++++++++++++++++++++-------- fairmq/sdk/DDSSession.h | 4 +-- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/fairmq/sdk/DDSSession.cxx b/fairmq/sdk/DDSSession.cxx index e6ed18bc..e4eb92a1 100644 --- a/fairmq/sdk/DDSSession.cxx +++ b/fairmq/sdk/DDSSession.cxx @@ -8,23 +8,21 @@ #include "DDSSession.h" +#include +#include +#include +#include +#include +#include +#include #include #include #include -#include - -#include - -#include - -#include - -#include -#include #include #include #include #include +#include namespace fair { namespace mq { @@ -375,6 +373,39 @@ auto operator<<(std::ostream& os, const DDSSession& session) -> std::ostream& return os << "$DDS_SESSION_ID: " << session.GetId(); } +auto getMostRecentRunningDDSSession(DDSEnv env) -> DDSSession +{ + boost::process::ipstream pipeStream; + boost::process::child c("dds-session list all", boost::process::std_out > pipeStream); + std::string lastLine; + std::string currentLine; + + while (pipeStream && std::getline(pipeStream, currentLine) && !currentLine.empty()) { + lastLine = currentLine; + } + c.wait(); + std::string sessionId; + + if (!lastLine.empty()) { + std::vector words; + std::istringstream iss(lastLine); + for (std::string s; iss >> s;) { + if (s != "*") { + words.push_back(s); + } + } + if (words.back() == "RUNNING") { + sessionId = words.front(); + } + } + + if (sessionId.empty()) { + throw std::runtime_error("could not find most recent DDS session"); + } + + return DDSSession(DDSSession::Id(sessionId), std::move(env)); +} + } // namespace sdk } // namespace mq } // namespace fair diff --git a/fairmq/sdk/DDSSession.h b/fairmq/sdk/DDSSession.h index 9c4eeb84..7a7e31dd 100644 --- a/fairmq/sdk/DDSSession.h +++ b/fairmq/sdk/DDSSession.h @@ -27,8 +27,6 @@ namespace fair { namespace mq { namespace sdk { -class DDSEnvironment; - /** * @enum DDSRMSPlugin DDSSession.h * @brief Supported DDS resource management system plugins @@ -133,6 +131,8 @@ class DDSSession std::shared_ptr fImpl; }; +auto getMostRecentRunningDDSSession(DDSEnv env = {}) -> DDSSession; + } // namespace sdk } // namespace mq } // namespace fair