[lttng-dev] [PATCH lttng-tools 8/8] Fix: add missing synchronization point for before app test case
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Wed Nov 19 17:45:59 EST 2014
----- Original Message -----
> From: "Mathieu Desnoyers" <mathieu.desnoyers at efficios.com>
> To: jgalar at efficios.com
> Cc: lttng-dev at lists.lttng.org, "Mathieu Desnoyers" <mathieu.desnoyers at efficios.com>
> Sent: Wednesday, November 19, 2014 10:40:32 PM
> Subject: [PATCH lttng-tools 8/8] Fix: add missing synchronization point for before app test case
>
> Fixes a race where the application could generate all its events before
> trace start.
>
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
> ---
[...]
> b/tests/utils/testapp/gen-ust-events/gen-ust-events.c
> index 42fa082..60f1c6f 100644
> --- a/tests/utils/testapp/gen-ust-events/gen-ust-events.c
> +++ b/tests/utils/testapp/gen-ust-events/gen-ust-events.c
> @@ -15,6 +15,7 @@
> * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> */
>
> +#define _GNU_SOURCE
> #include <assert.h>
> #include <arpa/inet.h>
> #include <fcntl.h>
> @@ -27,15 +28,21 @@
> #include <sys/types.h>
> #include <unistd.h>
> #include <stdbool.h>
> +#include <signal.h>
> +#include <poll.h>
> +#include <errno.h>
>
> #define TRACEPOINT_DEFINE
> #include "tp.h"
>
> void create_file(const char *path)
> {
> + static bool file_created = false;
> int ret;
>
> - assert(path);
> + if (!path || file_created) {
> + return;
> + }
>
> ret = creat(path, S_IRWXU);
> if (ret < 0) {
> @@ -44,6 +51,30 @@ void create_file(const char *path)
> }
>
> (void) close(ret);
> + file_created = true;
> +}
> +
> +static
> +void wait_on_file(const char *path)
> +{
> + if (!path) {
> + return;
> + }
> + for (;;) {
> + int ret;
> + struct stat buf;
> +
> + ret = stat(path, &buf);
> + if (ret == -1 && errno == ENOENT) {
> + (void) poll(NULL, 0, 10); /* 10 ms delay */
> + continue; /* retry */
> + }
> + if (ret) {
> + perror("stat");
> + exit(EXIT_FAILURE);
> + }
> + break; /* found */
> + }
> }
>
> int main(int argc, char **argv)
> @@ -55,8 +86,8 @@ int main(int argc, char **argv)
> float flt = 2222.0;
> int nr_iter = 100;
> useconds_t nr_usec = 0;
> - char *tmp_file_path = NULL;
> - bool file_created = false;
> + char *after_first_event_file_path = NULL;
> + char *before_last_event_file_path = NULL;
>
> if (argc >= 2) {
> /*
> @@ -71,22 +102,30 @@ int main(int argc, char **argv)
> }
>
> if (argc >= 4) {
> - tmp_file_path = argv[3];
> + after_first_event_file_path = argv[3];
> + }
> +
> + if (argc >= 5) {
> + before_last_event_file_path = argv[4];
> }
>
> for (i = 0; nr_iter < 0 || i < nr_iter; i++) {
> + if (nr_iter >= 0 && i == nr_iter) {
This should be if (nr_iter >= 0 && i == nr_iter - 1)
Thanks,
Mathieu
> + /*
> + * Wait on synchronization before writing last
> + * event.
> + */
> + wait_on_file(before_last_event_file_path);
> + }
> netint = htonl(i);
> - tracepoint(tp, tptest, i, netint, values, text, strlen(text), dbl,
> - flt);
> + tracepoint(tp, tptest, i, netint, values, text,
> + strlen(text), dbl, flt);
>
> /*
> - * First loop we create the file if asked to indicate that at least one
> - * tracepoint has been hit.
> + * First loop we create the file if asked to indicate
> + * that at least one tracepoint has been hit.
> */
> - if (!file_created && tmp_file_path) {
> - create_file(tmp_file_path);
> - file_created = true;
> - }
> + create_file(after_first_event_file_path);
> usleep(nr_usec);
> }
>
> --
> 2.1.1
>
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list