<div dir="ltr">Hi,<br><div><div class="gmail_extra"><br><div class="gmail_quote">On 4 September 2014 14:46, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Fri, 29 Aug 2014 11:21:29 +0200<br>
Marek Chalupa <<a href="mailto:mchqwerty@gmail.com">mchqwerty@gmail.com</a>> wrote:<br>
<br>
> This function is used in one test only, but its functionality can be<br>
> used in another tests to (create thread and wait until it is sleeping).<br>
> We just need to pass the starting function for the thread as an argument.<br>
><br>
> Signed-off-by: Marek Chalupa <<a href="mailto:mchqwerty@gmail.com">mchqwerty@gmail.com</a>><br>
> ---<br>
>  tests/display-test.c | 55 +++++++++++++++++++++++++---------------------------<br>
>  1 file changed, 26 insertions(+), 29 deletions(-)<br>
><br>
> diff --git a/tests/display-test.c b/tests/display-test.c<br>
> index c420cbe..1289866 100644<br>
> --- a/tests/display-test.c<br>
> +++ b/tests/display-test.c<br>
> @@ -333,6 +333,28 @@ register_reading(struct wl_display *display)<br>
>       assert(wl_display_flush(display) >= 0);<br>
>  }<br>
><br>
> +/* create thread that will call prepare+read so that<br>
> + * it will block */<br>
> +static pthread_t<br>
> +create_thread(struct client *c, void *(*func)(void*))<br>
> +{<br>
> +     pthread_t thread;<br>
> +<br>
> +     c->display_stopped = 0;<br>
> +     /* func must set display->stopped to 1 before sleeping */<br>
> +     assert(pthread_create(&thread, NULL, func, c) == 0);<br>
> +<br>
> +     /* make sure the thread is sleeping. It's a little bit racy<br>
> +      * (setting display_stopped to 1 and calling wl_display_read_events)<br>
> +      * so call usleep once again after the loop ends - it should<br>
> +      * be sufficient... */<br>
> +     while (c->display_stopped == 0)<br>
> +             usleep(500);<br>
> +     usleep(10000);<br>
> +<br>
> +     return thread;<br>
> +}<br>
> +<br>
>  static void *<br>
>  thread_read_error(void *data)<br>
>  {<br>
> @@ -369,16 +391,7 @@ threading_post_err(void)<br>
>       c->display_stopped = 0;<br>
><br>
>       /* create new thread that will register its intention too */<br>
> -     assert(pthread_create(&thread, NULL, thread_read_error, c) == 0);<br>
> -<br>
> -     /* make sure thread is sleeping. It's a little bit racy<br>
> -      * (setting display_stopped to 1 and calling wl_display_read_events)<br>
> -      * so call usleep once again after the loop ends - it should<br>
> -      * be sufficient... */<br>
> -     while (c->display_stopped == 0)<br>
> -             usleep(500);<br>
> -<br>
> -     usleep(10000);<br>
> +     thread = create_thread(c, thread_read_error);<br>
><br>
>       /* so now we have sleeping thread waiting for a pthread_cond signal.<br>
>        * The main thread must call wl_display_read_events().<br>
> @@ -429,22 +442,6 @@ thread_prepare_and_read(void *data)<br>
>       pthread_exit(NULL);<br>
>  }<br>
><br>
> -static pthread_t<br>
> -create_thread(struct client *c)<br>
> -{<br>
> -     pthread_t thread;<br>
> -<br>
> -     c->display_stopped = 0;<br>
> -     assert(pthread_create(&thread, NULL, thread_prepare_and_read, c) == 0);<br>
> -<br>
> -     /* make sure thread is sleeping */<br>
> -     while (c->display_stopped == 0)<br>
> -             usleep(500);<br>
> -     usleep(10000);<br>
> -<br>
> -     return thread;<br>
> -}<br>
> -<br>
>  /* test cancel read*/<br>
>  static void<br>
>  threading_cancel_read(void)<br>
> @@ -454,9 +451,9 @@ threading_cancel_read(void)<br>
><br>
>       register_reading(c->wl_display);<br>
><br>
> -     th1 = create_thread(c);<br>
> -     th2 = create_thread(c);<br>
> -     th3 = create_thread(c);<br>
> +     th1 = create_thread(c, thread_prepare_and_read);<br>
> +     th2 = create_thread(c, thread_prepare_and_read);<br>
> +     th3 = create_thread(c, thread_prepare_and_read);<br>
><br>
>       /* all the threads are sleeping, waiting until read or cancel<br>
>        * is called. Cancel the read and let the threads proceed */<br>
<br>
</div></div>Hi,<br>
<br>
I just realized, 'man usleep' says:<br>
<br>
       The  interaction  of this function with the SIGALRM signal, and with other timer functions<br>
       such as alarm(2), sleep(3), nanosleep(2), setitimer(2), timer_create(2),  timer_delete(2),<br>
       timer_getoverrun(2), timer_gettime(2), timer_settime(2), ualarm(3) is unspecified.<br>
<br>
And we are using alarm() here.<br></blockquote><div><br></div><div>Thanks, didn't realized that.<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Could you replace usleep() with nanosleep() in a follow-up patch?<br>
<br></blockquote><div><br>Sure<br> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks,<br>
pq<br>
</blockquote></div><br></div></div></div>