X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Futils%2Futils.cpp;fp=tests%2Futils%2Futils.cpp;h=fee74e961245d02e0322f70c86c9e7d21e33cd43;hp=0000000000000000000000000000000000000000;hb=729c1fec5976af17fded2f026725a08ef1924290;hpb=488dbb6062973d4990a33284e4717d89a893339d diff --git a/tests/utils/utils.cpp b/tests/utils/utils.cpp new file mode 100644 index 000000000..fee74e961 --- /dev/null +++ b/tests/utils/utils.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2015 Jérémie Galarneau + * + * SPDX-License-Identifier: LGPL-2.1-only + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "utils.h" + +static inline +int64_t elapsed_time_ns(struct timespec *t1, struct timespec *t2) +{ + struct timespec delta; + + LTTNG_ASSERT(t1 && t2); + delta.tv_sec = t2->tv_sec - t1->tv_sec; + delta.tv_nsec = t2->tv_nsec - t1->tv_nsec; + return ((int64_t) NSEC_PER_SEC * (int64_t) delta.tv_sec) + + (int64_t) delta.tv_nsec; +} + +int usleep_safe(useconds_t usec) +{ + int ret = 0; + struct timespec t1, t2; + int64_t time_remaining_ns = (int64_t) usec * (int64_t) NSEC_PER_USEC; + + ret = lttng_clock_gettime(CLOCK_MONOTONIC, &t1); + if (ret) { + ret = -1; + perror("clock_gettime"); + goto end; + } + + while (time_remaining_ns > 0) { + ret = usleep(time_remaining_ns / (int64_t) NSEC_PER_USEC); + if (ret && errno != EINTR) { + perror("usleep"); + goto end; + } + + ret = lttng_clock_gettime(CLOCK_MONOTONIC, &t2); + if (ret) { + perror("clock_gettime"); + goto end; + } + + time_remaining_ns -= elapsed_time_ns(&t1, &t2); + } +end: + return ret; +} + +int create_file(const char *path) +{ + int ret; + + if (!path) { + return -1; + } + + ret = creat(path, S_IRWXU); + if (ret < 0) { + perror("creat"); + return -1; + } + + ret = close(ret); + if (ret < 0) { + perror("close"); + return -1; + } + + return 0; +} + +int wait_on_file(const char *path) +{ + int ret; + struct stat buf; + + if (!path) { + return -1; + } + + for (;;) { + ret = stat(path, &buf); + if (ret == -1 && errno == ENOENT) { + ret = poll(NULL, 0, 10); /* 10 ms delay */ + /* Should return 0 everytime */ + if (ret) { + if (ret < 0) { + perror("perror"); + } else { + fprintf(stderr, + "poll return value is larger than zero\n"); + } + return -1; + } + continue; /* retry */ + } + if (ret) { + perror("stat"); + return -1; + } + break; /* found */ + } + + return 0; +}