Hi, On 4 September 2014 14:46, Pekka Paalanen <[email protected]> wrote:
> On Fri, 29 Aug 2014 11:21:29 +0200 > Marek Chalupa <[email protected]> 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 <[email protected]> > > --- > > 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 >
_______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
