[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