From patchwork Mon Jun 3 12:15:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Crowe X-Patchwork-Id: 32969 Received: (qmail 119995 invoked by alias); 3 Jun 2019 12:16:21 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 119935 invoked by uid 89); 3 Jun 2019 12:16:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.1 spammy=100000, 100000000, alarm, 1000000000 X-HELO: avasout02.plus.net X-CM-Score: 0.00 From: Mike Crowe To: libc-alpha@sourceware.org Cc: Mike Crowe Subject: [PATCH v1 2/4] nptl: Convert various tests to use libsupport Date: Mon, 3 Jun 2019 13:15:53 +0100 Message-Id: <5bae9211114a2e51562ec351093f8b52401f6d0d.1559564077.git-series.mac@mcrowe.com> In-Reply-To: References: MIME-Version: 1.0 * nptl/eintr.c: Use libsupport. * nptl/tst-eintr1.c: Use libsupport. * nptl/tst-eintr2.c: Use libsupport. * nptl/tst-eintr3.c: Use libsupport. * nptl/tst-eintr4.c: Use libsupport. * nptl/tst-eintr5.c: Use libsupport. * nptl/tst-mutex-errorcheck.c: Use libsupport. * nptl/tst-mutex5.c: Use libsupport. --- ChangeLog | 12 +++- nptl/eintr.c | 12 +-- nptl/tst-eintr1.c | 52 +----------- nptl/tst-eintr2.c | 60 +++----------- nptl/tst-eintr3.c | 23 +---- nptl/tst-eintr4.c | 15 +-- nptl/tst-eintr5.c | 40 ++------- nptl/tst-mutex-errorcheck.c | 29 ++----- nptl/tst-mutex5.c | 164 ++++++------------------------------- nptl/tst-mutex9.c | 131 ++++++------------------------ 10 files changed, 129 insertions(+), 409 deletions(-) diff --git a/ChangeLog b/ChangeLog index abb958d..2d9af44 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2019-05-30 Mike Crowe + * nptl/eintr.c: Use libsupport. + * nptl/tst-eintr1.c: Use libsupport. + * nptl/tst-eintr2.c: Use libsupport. + * nptl/tst-eintr3.c: Use libsupport. + * nptl/tst-eintr4.c: Use libsupport. + * nptl/tst-eintr5.c: Use libsupport. + * nptl/tst-mutex-errorcheck.c: Use libsupport. + * nptl/tst-mutex5.c: Use libsupport. + * nptl/tst-mutex9.c: Use libsupport. + +2019-05-30 Mike Crowe + * support/xtime.h: Add xclock_now() helper function. 2019-05-27 Mike Crowe diff --git a/nptl/eintr.c b/nptl/eintr.c index 4fc4d1c..6e644d2 100644 --- a/nptl/eintr.c +++ b/nptl/eintr.c @@ -19,6 +19,9 @@ #include #include #include +#include +#include +#include static int the_sig; @@ -46,7 +49,7 @@ eintr_source (void *arg) sigset_t ss; sigemptyset (&ss); sigaddset (&ss, the_sig); - pthread_sigmask (SIG_BLOCK, &ss, NULL); + xpthread_sigmask (SIG_BLOCK, &ss, NULL); } while (1) @@ -79,10 +82,5 @@ setup_eintr (int sig, pthread_t *thp) the_sig = sig; /* Create the thread which will fire off the signals. */ - pthread_t th; - if (pthread_create (&th, NULL, eintr_source, thp) != 0) - { - puts ("setup_eintr: pthread_create failed"); - exit (1); - } + xpthread_create (NULL, eintr_source, thp); } diff --git a/nptl/tst-eintr1.c b/nptl/tst-eintr1.c index 8134f0a..b60b796 100644 --- a/nptl/tst-eintr1.c +++ b/nptl/tst-eintr1.c @@ -22,11 +22,8 @@ #include #include #include - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include +#include #include "eintr.c" @@ -43,37 +40,8 @@ tf1 (void *arg) { while (1) { - pthread_t th; - - int e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - if (e == EINTR) - { - puts ("pthread_create returned EINTR"); - exit (1); - } - - char buf[100]; - printf ("tf1: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - e = pthread_join (th, NULL); - if (e != 0) - { - if (e == EINTR) - { - puts ("pthread_join returned EINTR"); - exit (1); - } - - char buf[100]; - printf ("tf1: pthread_join failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } + pthread_t th = xpthread_create (NULL, tf2, NULL); + xpthread_join (th); } } @@ -86,15 +54,7 @@ do_test (void) int i; for (i = 0; i < 10; ++i) { - pthread_t th; - int e = pthread_create (&th, NULL, tf1, NULL); - if (e != 0) - { - char buf[100]; - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } + pthread_t th = xpthread_create (NULL, tf1, NULL); } delayed_exit (3); @@ -102,3 +62,5 @@ do_test (void) (void) tf1 (NULL); return 1; } + +#include diff --git a/nptl/tst-eintr2.c b/nptl/tst-eintr2.c index 12e2715..c78c19a 100644 --- a/nptl/tst-eintr2.c +++ b/nptl/tst-eintr2.c @@ -23,11 +23,9 @@ #include #include #include - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include +#include +#include #include "eintr.c" @@ -39,12 +37,8 @@ static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER; static void * tf1 (void *arg) { - struct timespec ts; - struct timeval tv; - - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10000; + struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME), + make_timespec (10000, 0)); /* This call must never return. */ int e = pthread_mutex_timedlock (&m1, &ts); @@ -61,58 +55,34 @@ tf2 (void *arg) { while (1) { - int e = pthread_mutex_lock (&m2); - if (e != 0) - { - puts ("tf2: mutex_lock failed"); - exit (1); - } - e = pthread_mutex_unlock (&m2); - if (e != 0) - { - puts ("tf2: mutex_unlock failed"); - exit (1); - } + TEST_COMPARE (pthread_mutex_lock (&m2), 0); + TEST_COMPARE (pthread_mutex_unlock (&m2), 0); + struct timespec ts = { .tv_sec = 0, .tv_nsec = 10000000 }; nanosleep (&ts, NULL); } + return NULL; } static int do_test (void) { - if (pthread_mutex_lock (&m1) != 0) - { - puts ("mutex_lock failed"); - exit (1); - } + TEST_COMPARE (pthread_mutex_lock (&m1), 0); setup_eintr (SIGUSR1, NULL); - pthread_t th; char buf[100]; - int e = pthread_create (&th, NULL, tf1, NULL); - if (e != 0) - { - printf ("main: 1st pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } - - e = pthread_create (&th, NULL, tf2, NULL); - if (e != 0) - { - printf ("main: 2nd pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } + xpthread_create (NULL, tf1, NULL); + xpthread_create (NULL, tf2, NULL); delayed_exit (3); /* This call must never return. */ - e = pthread_mutex_lock (&m1); + int e = pthread_mutex_lock (&m1); printf ("main: mutex_lock returned: %s\n", strerror_r (e, buf, sizeof (buf))); return 1; } + +#include diff --git a/nptl/tst-eintr3.c b/nptl/tst-eintr3.c index d6c4e2b..0562eba 100644 --- a/nptl/tst-eintr3.c +++ b/nptl/tst-eintr3.c @@ -22,11 +22,8 @@ #include #include #include - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include +#include #include "eintr.c" @@ -35,9 +32,9 @@ static void * tf (void *arg) { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_lock (&m); + xpthread_mutex_lock (&m); /* This call must not return. */ - pthread_mutex_lock (&m); + xpthread_mutex_lock (&m); puts ("tf: mutex_lock returned"); exit (1); @@ -51,15 +48,7 @@ do_test (void) setup_eintr (SIGUSR1, &self); - pthread_t th; - char buf[100]; - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } + pthread_t th = xpthread_create (NULL, tf, NULL); delayed_exit (1); /* This call must never return. */ @@ -67,3 +56,5 @@ do_test (void) puts ("error: pthread_join returned"); return 1; } + +#include diff --git a/nptl/tst-eintr4.c b/nptl/tst-eintr4.c index 2d9b299..1f4b711 100644 --- a/nptl/tst-eintr4.c +++ b/nptl/tst-eintr4.c @@ -22,11 +22,8 @@ #include #include #include - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include +#include #include "eintr.c" @@ -39,11 +36,7 @@ do_test (void) setup_eintr (SIGUSR1, &self); pthread_barrier_t b; - if (pthread_barrier_init (&b, NULL, 2) != 0) - { - puts ("barrier_init failed"); - exit (1); - } + xpthread_barrier_init (&b, NULL, 2); delayed_exit (1); /* This call must never return. */ @@ -51,3 +44,5 @@ do_test (void) puts ("error: pthread_barrier_wait returned"); return 1; } + +#include diff --git a/nptl/tst-eintr5.c b/nptl/tst-eintr5.c index 6eee2a1..da049c4 100644 --- a/nptl/tst-eintr5.c +++ b/nptl/tst-eintr5.c @@ -23,11 +23,10 @@ #include #include #include - -static int do_test (void); - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include +#include +#include +#include #include "eintr.c" @@ -39,20 +38,12 @@ static pthread_cond_t c = PTHREAD_COND_INITIALIZER; static void * tf (void *arg) { - struct timespec ts; - struct timeval tv; - - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_sec += 10000; + struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME), + make_timespec (10000, 0)); /* This call must never return. */ - int e = pthread_cond_timedwait (&c, &m, &ts); - char buf[100]; - printf ("tf: cond_timedwait returned: %s\n", - strerror_r (e, buf, sizeof (buf))); - - exit (1); + TEST_COMPARE (pthread_cond_timedwait (&c, &m, &ts), 0); + FAIL_EXIT1 ("pthread_cond_timedwait returned unexpectedly\n"); } @@ -61,19 +52,12 @@ do_test (void) { setup_eintr (SIGUSR1, NULL); - pthread_t th; - char buf[100]; - int e = pthread_create (&th, NULL, tf, NULL); - if (e != 0) - { - printf ("main: pthread_create failed: %s\n", - strerror_r (e, buf, sizeof (buf))); - exit (1); - } + xpthread_create (NULL, tf, NULL); delayed_exit (3); /* This call must never return. */ xpthread_cond_wait (&c, &m); - puts ("error: pthread_cond_wait returned"); - return 1; + FAIL_RET ("error: pthread_cond_wait returned"); } + +#include diff --git a/nptl/tst-mutex-errorcheck.c b/nptl/tst-mutex-errorcheck.c index 30ff7ea..afc27e7 100644 --- a/nptl/tst-mutex-errorcheck.c +++ b/nptl/tst-mutex-errorcheck.c @@ -20,6 +20,7 @@ #include #include #include +#include static int do_test (void) @@ -29,33 +30,23 @@ do_test (void) pthread_mutexattr_t mutexattr; int ret = 0; - if (pthread_mutexattr_init (&mutexattr) != 0) - return 1; - if (pthread_mutexattr_settype (&mutexattr, PTHREAD_MUTEX_ERRORCHECK) != 0) - return 1; + TEST_COMPARE (pthread_mutexattr_init (&mutexattr), 0); + TEST_COMPARE (pthread_mutexattr_settype (&mutexattr, + PTHREAD_MUTEX_ERRORCHECK), 0); - if (pthread_mutex_init (&mutex, &mutexattr) != 0) - return 1; - if (pthread_mutexattr_destroy (&mutexattr) != 0) - return 1; + TEST_COMPARE (pthread_mutex_init (&mutex, &mutexattr), 0); + TEST_COMPARE (pthread_mutexattr_destroy (&mutexattr), 0); /* The call to pthread_mutex_timedlock erroneously enabled lock elision on the mutex, which then triggered an assertion failure in pthread_mutex_unlock. It would also defeat the error checking nature of the mutex. */ - if (pthread_mutex_timedlock (&mutex, &tms) != 0) - return 1; - if (pthread_mutex_timedlock (&mutex, &tms) != EDEADLK) - { - printf ("Failed error checking on locked mutex\n"); - ret = 1; - } + TEST_COMPARE (pthread_mutex_timedlock (&mutex, &tms), 0); + TEST_COMPARE (pthread_mutex_timedlock (&mutex, &tms), EDEADLK); - if (pthread_mutex_unlock (&mutex) != 0) - ret = 1; + TEST_COMPARE (pthread_mutex_unlock (&mutex), 0); return ret; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include diff --git a/nptl/tst-mutex5.c b/nptl/tst-mutex5.c index 4e1d93b..fb27152 100644 --- a/nptl/tst-mutex5.c +++ b/nptl/tst-mutex5.c @@ -24,6 +24,8 @@ #include #include #include +#include +#include #ifndef TYPE @@ -35,168 +37,60 @@ static int do_test (void) { pthread_mutex_t m; - struct timespec ts; - struct timeval tv; - struct timeval tv2; - int err; pthread_mutexattr_t a; - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } - - if (pthread_mutexattr_settype (&a, TYPE) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_init (&a), 0); + TEST_COMPARE (pthread_mutexattr_settype (&a, TYPE), 0); #ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT), 0); #endif - err = pthread_mutex_init (&m, &a); + int err = pthread_mutex_init (&m, &a); if (err != 0) { #ifdef ENABLE_PI if (err == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } + FAIL_UNSUPPORTED ("PI mutexes unsupported"); #endif - puts ("mutex_init failed"); - return 1; - } - - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } - - if (pthread_mutex_lock (&m) != 0) - { - puts ("mutex_lock failed"); - return 1; + FAIL_EXIT1 ("mutex_init failed"); } + TEST_COMPARE (pthread_mutexattr_destroy (&a), 0); + TEST_COMPARE (pthread_mutex_lock (&m), 0); if (pthread_mutex_trylock (&m) == 0) - { - puts ("mutex_trylock succeeded"); - return 1; - } + FAIL_EXIT1 ("mutex_trylock succeeded"); - gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); - - ts.tv_sec += 2; /* Wait 2 seconds. */ - - err = pthread_mutex_timedlock (&m, &ts); - if (err == 0) - { - puts ("timedlock succeeded"); - return 1; - } - else if (err != ETIMEDOUT) - { - printf ("timedlock error != ETIMEDOUT: %d\n", err); - return 1; - } - else - { - int clk_tck = sysconf (_SC_CLK_TCK); - - gettimeofday (&tv2, NULL); - - tv2.tv_sec -= tv.tv_sec; - tv2.tv_usec -= tv.tv_usec; - if (tv2.tv_usec < 0) - { - tv2.tv_usec += 1000000; - tv2.tv_sec -= 1; - } - - /* Be a bit tolerant, add one CLK_TCK. */ - tv2.tv_usec += 1000000 / clk_tck; - if (tv2.tv_usec >= 1000000) - { - tv2.tv_usec -= 1000000; - ++tv2.tv_sec; - } - - if (tv2.tv_sec < 2) - { - printf ("premature timeout: %jd.%06jd difference\n", - (intmax_t) tv2.tv_sec, (intmax_t) tv2.tv_usec); - return 1; - } - } + /* Wait 2 seconds. */ + struct timespec ts_timeout = timespec_add (xclock_now (CLOCK_REALTIME), + make_timespec (2, 0)); - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); + TEST_COMPARE (pthread_mutex_timedlock (&m, &ts_timeout), ETIMEDOUT); + TEST_TIMESPEC_BEFORE_NOW (ts_timeout, CLOCK_REALTIME); - ts.tv_sec += 2; /* Wait 2 seconds. */ /* The following makes the ts value invalid. */ - ts.tv_nsec += 1000000000; + ts_timeout.tv_nsec += 1000000000; - err = pthread_mutex_timedlock (&m, &ts); - if (err == 0) - { - puts ("2nd timedlock succeeded"); - return 1; - } - else if (err != EINVAL) - { - printf ("2nd timedlock error != EINVAL: %d\n", err); - return 1; - } + TEST_COMPARE (pthread_mutex_timedlock (&m, &ts_timeout), EINVAL); + TEST_COMPARE (pthread_mutex_unlock (&m), 0); - if (pthread_mutex_unlock (&m) != 0) - { - puts ("mutex_unlock failed"); - return 1; - } + const struct timespec ts_start = xclock_now (CLOCK_REALTIME); - (void) gettimeofday (&tv, NULL); - TIMEVAL_TO_TIMESPEC (&tv, &ts); + /* Wait 2 seconds. */ + ts_timeout = timespec_add (ts_start, make_timespec (2, 0)); - ts.tv_sec += 2; /* Wait 2 seconds. */ - if (pthread_mutex_timedlock (&m, &ts) != 0) - { - puts ("3rd timedlock failed"); - } + TEST_COMPARE (pthread_mutex_timedlock (&m, &ts_timeout), 0); - (void) gettimeofday (&tv2, NULL); + const struct timespec ts_end = xclock_now (CLOCK_REALTIME); /* Check that timedlock didn't delay. We use a limit of 0.1 secs. */ - timersub (&tv2, &tv, &tv2); - if (tv2.tv_sec > 0 || tv2.tv_usec > 100000) - { - puts ("3rd timedlock didn't return right away"); - return 1; - } + TEST_TIMESPEC_BEFORE (ts_end, + timespec_add (ts_start, make_timespec (0, 100000000))); - if (pthread_mutex_unlock (&m) != 0) - { - puts ("final mutex_unlock failed"); - return 1; - } - - if (pthread_mutex_destroy (&m) != 0) - { - puts ("mutex_destroy failed"); - return 1; - } + TEST_COMPARE (pthread_mutex_unlock (&m), 0); + TEST_COMPARE (pthread_mutex_destroy (&m), 0); return 0; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include diff --git a/nptl/tst-mutex9.c b/nptl/tst-mutex9.c index 917276e..e9fd8e2 100644 --- a/nptl/tst-mutex9.c +++ b/nptl/tst-mutex9.c @@ -26,6 +26,9 @@ #include #include #include +#include +#include +#include static int @@ -42,10 +45,7 @@ do_test (void) fd = mkstemp (tmpfname); if (fd == -1) - { - printf ("cannot open temporary file: %m\n"); - return 1; - } + FAIL_EXIT1 ("cannot open temporary file: %m\n"); /* Make sure it is always removed. */ unlink (tmpfname); @@ -54,46 +54,21 @@ do_test (void) memset (data, '\0', ps); /* Write the data to the file. */ - if (write (fd, data, ps) != (ssize_t) ps) - { - puts ("short write"); - return 1; - } + xwrite (fd, data, ps); - mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (mem == MAP_FAILED) - { - printf ("mmap failed: %m\n"); - return 1; - } + mem = xmmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd); m = (pthread_mutex_t *) (((uintptr_t) mem + __alignof (pthread_mutex_t)) & ~(__alignof (pthread_mutex_t) - 1)); - if (pthread_mutexattr_init (&a) != 0) - { - puts ("mutexattr_init failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_init (&a), 0); - if (pthread_mutexattr_setpshared (&a, PTHREAD_PROCESS_SHARED) != 0) - { - puts ("mutexattr_setpshared failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_setpshared (&a, PTHREAD_PROCESS_SHARED), 0); - if (pthread_mutexattr_settype (&a, PTHREAD_MUTEX_RECURSIVE) != 0) - { - puts ("mutexattr_settype failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_settype (&a, PTHREAD_MUTEX_RECURSIVE), 0); #ifdef ENABLE_PI - if (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT) != 0) - { - puts ("pthread_mutexattr_setprotocol failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_setprotocol (&a, PTHREAD_PRIO_INHERIT), 0); #endif int e; @@ -101,70 +76,29 @@ do_test (void) { #ifdef ENABLE_PI if (e == ENOTSUP) - { - puts ("PI mutexes unsupported"); - return 0; - } + FAIL_UNSUPPORTED ("PI mutexes unsupported"); #endif - puts ("mutex_init failed"); - return 1; + FAIL_EXIT1 ("mutex_init failed"); } - if (pthread_mutex_lock (m) != 0) - { - puts ("mutex_lock failed"); - return 1; - } + TEST_COMPARE (pthread_mutex_lock (m), 0); - if (pthread_mutexattr_destroy (&a) != 0) - { - puts ("mutexattr_destroy failed"); - return 1; - } + TEST_COMPARE (pthread_mutexattr_destroy (&a), 0); puts ("going to fork now"); - pid = fork (); - if (pid == -1) - { - puts ("fork failed"); - return 1; - } - else if (pid == 0) + pid = xfork (); + if (pid == 0) { if (pthread_mutex_trylock (m) == 0) - { - puts ("child: mutex_trylock succeeded"); - exit (1); - } + FAIL_EXIT1 ("child: mutex_trylock succeeded"); if (pthread_mutex_unlock (m) == 0) - { - puts ("child: mutex_unlock succeeded"); - exit (1); - } - - struct timeval tv; - gettimeofday (&tv, NULL); - struct timespec ts; - TIMEVAL_TO_TIMESPEC (&tv, &ts); - ts.tv_nsec += 500000000; - if (ts.tv_nsec >= 1000000000) - { - ++ts.tv_sec; - ts.tv_nsec -= 1000000000; - } - - e = pthread_mutex_timedlock (m, &ts); - if (e == 0) - { - puts ("child: mutex_timedlock succeeded"); - exit (1); - } - if (e != ETIMEDOUT) - { - puts ("child: mutex_timedlock didn't time out"); - exit (1); - } + FAIL_EXIT1 ("child: mutex_unlock succeeded"); + + const struct timespec ts = timespec_add (xclock_now (CLOCK_REALTIME), + make_timespec (0, 500000000)); + + TEST_COMPARE (pthread_mutex_timedlock (m, &ts), ETIMEDOUT); alarm (1); @@ -179,23 +113,12 @@ do_test (void) int status; if (TEMP_FAILURE_RETRY (waitpid (pid, &status, 0)) != pid) - { - puts ("waitpid failed"); - return 1; - } + FAIL_EXIT1 ("waitpid failed"); if (! WIFSIGNALED (status)) - { - puts ("child not killed by signal"); - return 1; - } - if (WTERMSIG (status) != SIGALRM) - { - puts ("child not killed by SIGALRM"); - return 1; - } + FAIL_EXIT1 ("child not killed by signal"); + TEST_COMPARE (WTERMSIG (status), SIGALRM); return 0; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include