----- Original Message -----
> From: "Mathieu Desnoyers" <[email protected]>
> To: [email protected]
> Cc: [email protected], "Mathieu Desnoyers" 
> <[email protected]>
> 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 <[email protected]>
> ---
[...]
> 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

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to