This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v1 2/4] nptl: Convert various tests to use libsupport
On 03/06/2019 09:15, Mike Crowe wrote:
> * 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.
LGTM, thanks.
> ---
> 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 <mac@mcrowe.com>
>
> + * 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 <mac@mcrowe.com>
> +
> * support/xtime.h: Add xclock_now() helper function.
>
> 2019-05-27 Mike Crowe <mac@mcrowe.com>
> 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 <pthread.h>
> #include <signal.h>
> #include <unistd.h>
> +#include <support/xthread.h>
> +#include <support/xsignal.h>
> +#include <support/xthread.h>
>
>
> 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);
> }
Ok.
> 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 <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> -
> -static int do_test (void);
> -
> -#define TEST_FUNCTION do_test ()
> -#include "../test-skeleton.c"
> +#include <support/check.h>
> +#include <support/xthread.h>
>
> #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);
Ok.
> @@ -102,3 +62,5 @@ do_test (void)
> (void) tf1 (NULL);
> return 1;
> }
> +
> +#include <support/test-driver.c>
Ok.
> 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 <stdlib.h>
> #include <string.h>
> #include <sys/time.h>
> -
> -static int do_test (void);
> -
> -#define TEST_FUNCTION do_test ()
> -#include "../test-skeleton.c"
> +#include <support/check.h>
> +#include <support/timespec.h>
> +#include <support/xtime.h>
>
> #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);
Ok.
> @@ -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;
> }
>
Ok.
>
> 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 <support/test-driver.c>
Ok.
> 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 <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> -
> -static int do_test (void);
> -
> -#define TEST_FUNCTION do_test ()
> -#include "../test-skeleton.c"
> +#include <support/check.h>
> +#include <support/xthread.h>
>
> #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 <support/test-driver.c>
Ok.
> 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 <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> -
> -static int do_test (void);
> -
> -#define TEST_FUNCTION do_test ()
> -#include "../test-skeleton.c"
> +#include <support/check.h>
> +#include <support/xthread.h>
>
> #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 <support/test-driver.c>
Ok.
> 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 <stdlib.h>
> #include <string.h>
> #include <sys/time.h>
> -
> -static int do_test (void);
> -
> -#define TEST_FUNCTION do_test ()
> -#include "../test-skeleton.c"
> +#include <support/check.h>
> +#include <support/timespec.h>
> +#include <support/xthread.h>
> +#include <support/xtime.h>
>
> #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");
> }
>
Ok.
>
> @@ -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 <support/test-driver.c>
Ok.
> 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 <errno.h>
> #include <time.h>
> #include <pthread.h>
> +#include <support/check.h>
>
> 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 <support/test-driver.c>
Ok.
> 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 <sys/time.h>
> #include <stdint.h>
> #include <config.h>
> +#include <support/check.h>
> +#include <support/timespec.h>
>
>
> #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));
>
Ok.
> - (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 <support/test-driver.c>
Ok.
> 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 <sys/mman.h>
> #include <sys/time.h>
> #include <sys/wait.h>
> +#include <support/check.h>
> +#include <support/timespec.h>
> +#include <support/xunistd.h>
>
>
> 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);
Ok.
>
> @@ -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 <support/test-driver.c>
>
Ok.