[PATCH 2/4] display-test: make use of create_thread function

Pekka Paalanen ppaalanen at gmail.com
Thu Sep 4 05:46:29 PDT 2014


On Fri, 29 Aug 2014 11:21:29 +0200
Marek Chalupa <mchqwerty at 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 <mchqwerty at 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


More information about the wayland-devel mailing list