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

Marek Chalupa mchqwerty at gmail.com
Tue Sep 9 00:47:53 PDT 2014


Hi,

On 4 September 2014 14:46, Pekka Paalanen <ppaalanen at gmail.com> wrote:

> 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.
>

Thanks, didn't realized that.


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


>
> Thanks,
> pq
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/wayland-devel/attachments/20140909/e8593326/attachment.html>


More information about the wayland-devel mailing list