On Fri, 29 Aug 2014 11:21:29 +0200
Marek Chalupa <mchqwe...@gmail.com> wrote:

> This function is used in one test only, but its functionality can be
> used in another tests to (create thread and wait until it is sleeping).
> We just need to pass the starting function for the thread as an argument.
> 
> Signed-off-by: Marek Chalupa <mchqwe...@gmail.com>
> ---
>  tests/display-test.c | 55 
> +++++++++++++++++++++++++---------------------------
>  1 file changed, 26 insertions(+), 29 deletions(-)
> 
> diff --git a/tests/display-test.c b/tests/display-test.c
> index c420cbe..1289866 100644
> --- a/tests/display-test.c
> +++ b/tests/display-test.c
> @@ -333,6 +333,28 @@ register_reading(struct wl_display *display)
>       assert(wl_display_flush(display) >= 0);
>  }
>  
> +/* create thread that will call prepare+read so that
> + * it will block */
> +static pthread_t
> +create_thread(struct client *c, void *(*func)(void*))
> +{
> +     pthread_t thread;
> +
> +     c->display_stopped = 0;
> +     /* func must set display->stopped to 1 before sleeping */
> +     assert(pthread_create(&thread, NULL, func, c) == 0);
> +
> +     /* make sure the thread is sleeping. It's a little bit racy
> +      * (setting display_stopped to 1 and calling wl_display_read_events)
> +      * so call usleep once again after the loop ends - it should
> +      * be sufficient... */
> +     while (c->display_stopped == 0)
> +             usleep(500);
> +     usleep(10000);
> +
> +     return thread;
> +}
> +
>  static void *
>  thread_read_error(void *data)
>  {
> @@ -369,16 +391,7 @@ threading_post_err(void)
>       c->display_stopped = 0;
>  
>       /* create new thread that will register its intention too */
> -     assert(pthread_create(&thread, NULL, thread_read_error, c) == 0);
> -
> -     /* make sure thread is sleeping. It's a little bit racy
> -      * (setting display_stopped to 1 and calling wl_display_read_events)
> -      * so call usleep once again after the loop ends - it should
> -      * be sufficient... */
> -     while (c->display_stopped == 0)
> -             usleep(500);
> -
> -     usleep(10000);
> +     thread = create_thread(c, thread_read_error);
>  
>       /* so now we have sleeping thread waiting for a pthread_cond signal.
>        * The main thread must call wl_display_read_events().
> @@ -429,22 +442,6 @@ thread_prepare_and_read(void *data)
>       pthread_exit(NULL);
>  }
>  
> -static pthread_t
> -create_thread(struct client *c)
> -{
> -     pthread_t thread;
> -
> -     c->display_stopped = 0;
> -     assert(pthread_create(&thread, NULL, thread_prepare_and_read, c) == 0);
> -
> -     /* make sure thread is sleeping */
> -     while (c->display_stopped == 0)
> -             usleep(500);
> -     usleep(10000);
> -
> -     return thread;
> -}
> -
>  /* test cancel read*/
>  static void
>  threading_cancel_read(void)
> @@ -454,9 +451,9 @@ threading_cancel_read(void)
>  
>       register_reading(c->wl_display);
>  
> -     th1 = create_thread(c);
> -     th2 = create_thread(c);
> -     th3 = create_thread(c);
> +     th1 = create_thread(c, thread_prepare_and_read);
> +     th2 = create_thread(c, thread_prepare_and_read);
> +     th3 = create_thread(c, thread_prepare_and_read);
>  
>       /* all the threads are sleeping, waiting until read or cancel
>        * is called. Cancel the read and let the threads proceed */

Hi,

I just realized, 'man usleep' says:

       The  interaction  of this function with the SIGALRM signal, and with 
other timer functions
       such as alarm(2), sleep(3), nanosleep(2), setitimer(2), timer_create(2), 
 timer_delete(2),
       timer_getoverrun(2), timer_gettime(2), timer_settime(2), ualarm(3) is 
unspecified.

And we are using alarm() here.

Could you replace usleep() with nanosleep() in a follow-up patch?


Thanks,
pq
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to