On Wed, 27 Feb 2019 21:13:09 +0200
Leonid Bobrov <mazoc...@disroot.org> wrote:

> From: Vadim Zhukov <persg...@gmail.com>
> 
> *BSD don't have waitid()

Hi Leonid,

many details to fix here. This patch breaks all tests that use the
runner on Linux.

> 
> Co-authored-by: Koop Mast <k...@rainbow-runner.nl>
> Signed-off-by: Leonid Bobrov <mazoc...@disroot.org>
> ---
>  configure.ac            |  4 ++++
>  tests/test-compositor.c | 25 +++++++++++++++++++++++--
>  tests/test-runner.c     | 29 ++++++++++++++++++++++++++++-
>  3 files changed, 55 insertions(+), 3 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 495e1a6..c0f1c37 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -65,6 +65,10 @@ AC_SUBST(GCC_CFLAGS)
>  AC_CHECK_HEADERS([sys/prctl.h])
>  AC_CHECK_FUNCS([accept4 mkostemp posix_fallocate prctl])
>  
> +# waitid() and signal.h are needed for the test suite.
> +AC_CHECK_FUNCS([waitid])

Should you not check for waitpid as well, to error out on systems where
neither is present rather than assuming that lack of waitid means
waitpid is present?

> +AC_CHECK_HEADERS([signal.h])

The result for the signal.h check does not seem to be used at all.
Should it not?

> +
>  AC_ARG_ENABLE([libraries],
>             [AC_HELP_STRING([--disable-libraries],
>                             [Disable compilation of wayland libraries])],
> diff --git a/tests/test-compositor.c b/tests/test-compositor.c
> index 72f6351..6e12630 100644
> --- a/tests/test-compositor.c
> +++ b/tests/test-compositor.c
> @@ -23,6 +23,8 @@
>   * SOFTWARE.
>   */
>  
> +#include "config.h"
> +
>  #include <assert.h>
>  #include <errno.h>
>  #include <stdio.h>
> @@ -86,8 +88,8 @@ get_socket_name(void)
>       static char retval[64];
>  
>       gettimeofday(&tv, NULL);
> -     snprintf(retval, sizeof retval, "wayland-test-%d-%ld%ld",
> -              getpid(), tv.tv_sec, tv.tv_usec);
> +     snprintf(retval, sizeof retval, "wayland-test-%d-%lld%lld",
> +              getpid(), (long long)tv.tv_sec, (long long)tv.tv_usec);

This hunk does not seem to have anything to do with waitid, hence does
not belong in this patch.

>  
>       return retval;
>  }
> @@ -97,10 +99,15 @@ handle_client_destroy(void *data)
>  {
>       struct client_info *ci = data;
>       struct display *d;
> +#ifdef HAVE_WAITID
>       siginfo_t status;
> +#else
> +     int istatus;
> +#endif
>  
>       d = ci->display;
>  
> +#ifdef HAVE_WAITID
>       assert(waitid(P_PID, ci->pid, &status, WEXITED) != -1);

Would it not be easier to rewrite this code to use waitpid() instead?

>  
>       switch (status.si_code) {
> @@ -118,6 +125,20 @@ handle_client_destroy(void *data)
>               ci->exit_code = status.si_status;
>               break;
>       }
> +#else
> +     assert(waitpid(ci->pid, &istatus, WNOHANG) != -1);

Why WNOHANG? We do want to wait for the child to exit if it hasn't
already.

> +
> +     if (WIFSIGNALED(istatus)) {
> +             fprintf(stderr, "Client '%s' was killed by signal %d\n",
> +                     ci->name, WTERMSIG(istatus));
> +             ci->exit_code = WEXITSTATUS(istatus);
> +     } else if (WIFEXITED(istatus)) {
> +             if (WEXITSTATUS(istatus) != EXIT_SUCCESS)
> +                     fprintf(stderr, "Client '%s' exited with code %d\n",
> +                             ci->name, WEXITSTATUS(istatus));
> +             ci->exit_code = WEXITSTATUS(istatus);
> +     }
> +#endif

Btw. such big or multiple #ifdef blocks inside a function that also has
common stuff make understanding it more difficult. If such alternate
paths must exist, they would be better as a separate function whose
whole body is switched.

>  
>       ++d->clients_terminated_no;
>       if (d->clients_no == d->clients_terminated_no) {
> diff --git a/tests/test-runner.c b/tests/test-runner.c
> index 1487dc4..7fa72eb 100644
> --- a/tests/test-runner.c
> +++ b/tests/test-runner.c
> @@ -23,6 +23,8 @@
>   * SOFTWARE.
>   */
>  
> +#include "config.h"
> +
>  #define _GNU_SOURCE
>  
>  #include <unistd.h>
> @@ -32,6 +34,7 @@
>  #include <sys/wait.h>
>  #include <sys/stat.h>
>  #include <string.h>
> +#include <signal.h>
>  #include <assert.h>
>  #include <dlfcn.h>
>  #include <errno.h>
> @@ -293,7 +296,11 @@ int main(int argc, char *argv[])
>       const struct test *t;
>       pid_t pid;
>       int total, pass;
> +#ifdef HAVE_WAITID
>       siginfo_t info;
> +#else
> +     int status;
> +#endif
>  
>       if (isatty(fileno(stderr)))
>               is_atty = 1;
> @@ -336,7 +343,8 @@ int main(int argc, char *argv[])
>               if (pid == 0)
>                       run_test(t); /* never returns */
>  
> -             if (waitid(P_PID, pid, &info, WEXITED)) {
> +#ifdef HAVE_WAITID
> +             if (waitid(P_PID, 0, &info, WEXITED)) {

Why change this?

Could this code not be rewritten to use waitpid() instead of waitid()?

>                       stderr_set_color(RED);
>                       fprintf(stderr, "waitid failed: %m\n");
>                       stderr_reset_color();
> @@ -367,6 +375,25 @@ int main(int argc, char *argv[])
>  
>                       break;
>               }
> +#else
> +             if (waitpid(-1, &status, 0) == -1) {

Why not wait for the right pid?

> +                     fprintf(stderr, "waitpid failed: %s\n",
> +                             strerror(errno));
> +                     abort();
> +             }
> +
> +             fprintf(stderr, "test \"%s\":\t", t->name);
> +             if (WIFEXITED(status)) {

Looks like an unbalanced opening brace.

> +                     fprintf(stderr, "exit status %d", WEXITSTATUS(status));

Color coding of the prints is missing.

> +                     if (WEXITSTATUS(status) == EXIT_SUCCESS)
> +                             success = 1;
> +                     } else if (WIFSIGNALED(status)) {
> +                             fprintf(stderr, "signal %d", WTERMSIG(status));
> +                     }
> +#endif
> +
> +             if (t->must_fail)
> +                     success = !success;

Having this in the common path does not seem right.

>  
>               if (success) {
>                       pass++;


Thanks,
pq

Attachment: pgpwUdm9HX0rS.pgp
Description: OpenPGP digital signature

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to