agent/native/libcommon/code/CommonUtils.cpp (66 lines of code) (raw):
#include "CommonUtils.h"
#include <algorithm>
#include <chrono>
#include <string_view>
#include <signal.h>
#include <stddef.h>
#include <sys/types.h>
#include <unistd.h>
namespace elasticapm::utils {
using namespace std::string_view_literals;
[[maybe_unused]] bool blockSignal(int signo) {
sigset_t currentSigset;
if (pthread_sigmask(SIG_BLOCK, NULL, ¤tSigset) != 0) {
sigemptyset(¤tSigset);
}
if (sigismember(¤tSigset, signo) == 1) {
return true;
}
sigaddset(¤tSigset, signo);
return pthread_sigmask(SIG_BLOCK, ¤tSigset, NULL) == 0;
}
std::chrono::milliseconds convertDurationWithUnit(std::string timeWithUnit) {
auto endWithoutSpaces = std::remove_if(timeWithUnit.begin(), timeWithUnit.end(), [](unsigned char c) { return std::isspace(c); });
timeWithUnit.erase(endWithoutSpaces, timeWithUnit.end());
double timeValue = std::stod(timeWithUnit.data());
auto unitPos = timeWithUnit.find_first_not_of("0123456789."sv);
if (unitPos == std::string_view::npos) {
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double, std::milli>(timeValue)) ;
}
std::string unit{timeWithUnit.substr(unitPos)};
if (unit == "ms") {
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double, std::milli>(timeValue)) ;
} else if (unit == "s") {
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double>(timeValue)) ;
} else if (unit == "m") {
return std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::duration<double, std::ratio<60>>(timeValue)) ;
}
throw std::invalid_argument("Invalid time unit.");
}
std::string getParameterizedString(std::string_view format) {
std::string out;
for (auto c = format.begin(); c < format.end(); ++c) {
if (*c == '%') {
c++;
if (c == format.end()) {
out.append(1, '%');
break;
}
switch (*c) {
case 'p':
out.append(std::to_string(getpid()));
break;
case 't':
out.append(std::to_string(std::chrono::milliseconds(std::time(NULL)).count()));
break;
default:
out.append(1, '%');
out.append(1, *c);
}
} else {
out.append({*c});
}
}
return out;
}
}