7 #include <framework/utilities/Utils.h>
9 #include <framework/gearbox/Unit.h>
10 #include <framework/logging/Logger.h>
12 #include <boost/process.hpp>
33 std::pair<unsigned long, unsigned long> getStatmSize()
36 const static long pageSizeKb = sysconf(_SC_PAGESIZE) / 1024;
37 static FILE* stream =
nullptr;
39 int currentPid = getpid();
40 if (currentPid != pid) {
42 std::string statm =
"/proc/" + std::to_string(pid) +
"/statm";
43 stream = fopen(statm.c_str(),
"r");
46 setvbuf(stream,
nullptr, _IONBF, 0);
48 unsigned long vmSizePages{0};
49 unsigned long rssPages{0};
51 fscanf(stream,
"%lu %lu", &vmSizePages, &rssPages);
52 return std::make_pair(vmSizePages * pageSizeKb, rssPages * pageSizeKb);
61 clock_gettime(CLOCK_REALTIME, &ts);
67 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);
73 return getStatmSize().first;
78 return getStatmSize().second;
83 m_text(std::move(text))
89 B2INFO(
m_text <<
" " << std::fixed << std::setprecision(3) << elapsed <<
" ms");
92 std::string
getCommandOutput(
const std::string& command,
const std::vector<std::string>& arguments,
95 namespace bp = boost::process;
96 auto cmd = searchPath ? bp::search_path(command) : boost::filesystem::path(command);
98 bp::child child(cmd, bp::args(arguments), bp::std_in.close(), bp::std_out > cmdOut);
101 while (child.running() && cmdOut.read(buffer,
sizeof(buffer))) {
102 result.append(buffer,
sizeof(buffer));
104 if (cmdOut.gcount()) result.append(buffer, cmdOut.gcount());