*
*/
-#include <common/time.h>
-#include <common/error.h>
-#include <common/macros.h>
-#include <common/error.h>
-#include <common/compat/errno.h>
-#include <stddef.h>
-#include <stdint.h>
+#include <common/compat/errno.hpp>
+#include <common/error.hpp>
+#include <common/exception.hpp>
+#include <common/macros.hpp>
+#include <common/time.hpp>
+
+#include <algorithm>
#include <limits.h>
-#include <pthread.h>
#include <locale.h>
+#include <pthread.h>
+#include <stddef.h>
+#include <stdint.h>
#include <string.h>
-#include <algorithm>
static bool utf8_output_supported;
-bool locale_supports_utf8(void)
+bool locale_supports_utf8()
{
return utf8_output_supported;
}
if (ts.tv_sec > ULONG_MAX / MSEC_PER_SEC) {
errno = EOVERFLOW;
- return -1; /* multiplication overflow */
+ return -1; /* multiplication overflow */
}
res = ts.tv_sec * MSEC_PER_SEC;
remain_ms = ULONG_MAX - res;
if (ts.tv_nsec / NSEC_PER_MSEC > remain_ms) {
errno = EOVERFLOW;
- return -1; /* addition overflow */
+ return -1; /* addition overflow */
}
res += ts.tv_nsec / NSEC_PER_MSEC;
*ms = res;
struct timespec timespec_abs_diff(struct timespec t1, struct timespec t2)
{
- uint64_t ts1 = (uint64_t) t1.tv_sec * (uint64_t) NSEC_PER_SEC +
- (uint64_t) t1.tv_nsec;
- uint64_t ts2 = (uint64_t) t2.tv_sec * (uint64_t) NSEC_PER_SEC +
- (uint64_t) t2.tv_nsec;
+ uint64_t ts1 = (uint64_t) t1.tv_sec * (uint64_t) NSEC_PER_SEC + (uint64_t) t1.tv_nsec;
+ uint64_t ts2 = (uint64_t) t2.tv_sec * (uint64_t) NSEC_PER_SEC + (uint64_t) t2.tv_nsec;
uint64_t diff = std::max(ts1, ts2) - std::min(ts1, ts2);
struct timespec res;
return res;
}
-static
-void __attribute__((constructor)) init_locale_utf8_support(void)
+static void __attribute__((constructor)) init_locale_utf8_support()
{
- const char *program_locale = setlocale(LC_ALL, NULL);
+ const char *program_locale = setlocale(LC_ALL, nullptr);
const char *lang = getenv("LANG");
if (program_locale && strstr(program_locale, "utf8")) {
if (len < ISO8601_STR_LEN) {
ERR("Buffer too short to format ISO 8601 timestamp: %zu bytes provided when at least %zu are needed",
- len, ISO8601_STR_LEN);
+ len,
+ ISO8601_STR_LEN);
ret = -1;
goto end;
}
if (len < DATETIME_STR_LEN) {
ERR("Buffer too short to format to datetime: %zu bytes provided when at least %zu are needed",
- len, DATETIME_STR_LEN);
+ len,
+ DATETIME_STR_LEN);
ret = -1;
goto end;
}
end:
return ret;
}
+
+std::string lttng::utils::time_to_iso8601_str(std::time_t time)
+{
+ std::string iso8601_str(ISO8601_STR_LEN, '\0');
+ const auto ret = ::time_to_iso8601_str(time, &iso8601_str[0], iso8601_str.capacity());
+
+ if (ret) {
+ LTTNG_THROW_ERROR("Failed to format time to iso8601 format");
+ }
+
+ /* Don't include '\0' in the C++ string. */
+ iso8601_str.resize(iso8601_str.size() - 1);
+
+ return iso8601_str;
+}