[PATCH] modetest: Use threads for cursors instead of SIGALRM

Rob Clark robdclark at gmail.com
Sat Nov 22 08:47:58 PST 2014


On Sat, Nov 22, 2014 at 12:37 AM, Jasper St. Pierre
<jstpierre at mecheye.net> wrote:
> This fixes an issue when trying to use -v and -C together. When trying
> to read the page flip event, we are interrupted by the SIGALRM that
> comes in, and so we think we timed out when we simply got EINTR. While
> we could just loop checking for EINTR, SIGALRM is just bad idea to
> begin with, so just rewrite it to use a thread.

I did eventually remember why I used a signal handler.. to emulate a
bit how input is handled on a signal handler in xorg.  But really,
that is kinda pointless, since the kernel doesn't really care.  This
is more sane.  Pushed, thanks

BR,
-R

> ---
>  tests/modetest/Makefile.am |  3 ++-
>  tests/modetest/cursor.c    | 57 +++++++++++++++++++++++-----------------------
>  2 files changed, 31 insertions(+), 29 deletions(-)
>
> diff --git a/tests/modetest/Makefile.am b/tests/modetest/Makefile.am
> index 0a6af01..8fc924a 100644
> --- a/tests/modetest/Makefile.am
> +++ b/tests/modetest/Makefile.am
> @@ -19,7 +19,8 @@ modetest_SOURCES = $(MODETEST_FILES)
>
>  modetest_LDADD = \
>         $(top_builddir)/libdrm.la \
> -       $(top_builddir)/libkms/libkms.la
> +       $(top_builddir)/libkms/libkms.la \
> +       -lpthread
>
>  if HAVE_CAIRO
>  AM_CFLAGS += $(CAIRO_CFLAGS)
> diff --git a/tests/modetest/cursor.c b/tests/modetest/cursor.c
> index 60f240a..62a50ef 100644
> --- a/tests/modetest/cursor.c
> +++ b/tests/modetest/cursor.c
> @@ -34,6 +34,8 @@
>  #include <string.h>
>  #include <signal.h>
>  #include <sys/time.h>
> +#include <pthread.h>
> +#include <unistd.h>
>
>  #include "xf86drm.h"
>  #include "xf86drmMode.h"
> @@ -59,6 +61,9 @@ struct cursor {
>  static struct cursor cursors[MAX_CURSORS];
>  static int ncursors;
>
> +static pthread_t cursor_thread;
> +static int cursor_running;
> +
>  /*
>   * Timer driven program loops through these steps to move/enable/disable
>   * the cursor
> @@ -137,33 +142,29 @@ static struct cursor_step steps[] = {
>                 {  set_cursor, 10,   0,  0 },  /* disable */
>  };
>
> -/*
> - * Cursor API:
> - */
> -
> -static void run_step(int sig)
> +static void *cursor_thread_func(void *data)
>  {
> -       struct cursor_step *step = &steps[indx % ARRAY_SIZE(steps)];
> -       struct itimerval itimer = {
> -                       .it_value.tv_usec = 1000 * step->msec,
> -       };
> -       int i;
> -
> -       for (i = 0; i < ncursors; i++) {
> -               struct cursor *cursor = &cursors[i];
> -               step->run(cursor, step);
> -       }
> -
> -       /* iterate to next count/step: */
> -       if (count < step->repeat) {
> -               count++;
> -       } else {
> -               count = 0;
> -               indx++;
> +       while (cursor_running) {
> +               struct cursor_step *step = &steps[indx % ARRAY_SIZE(steps)];
> +               int i;
> +
> +               for (i = 0; i < ncursors; i++) {
> +                       struct cursor *cursor = &cursors[i];
> +                       step->run(cursor, step);
> +               }
> +
> +               /* iterate to next count/step: */
> +               if (count < step->repeat) {
> +                       count++;
> +               } else {
> +                       count = 0;
> +                       indx++;
> +               }
> +
> +               usleep(1000 * step->msec);
>         }
>
> -       /* and lastly, setup timer for next step */
> -       setitimer(ITIMER_REAL, &itimer, NULL);
> +       return NULL;
>  }
>
>  int cursor_init(int fd, uint32_t bo_handle, uint32_t crtc_id,
> @@ -194,16 +195,16 @@ int cursor_init(int fd, uint32_t bo_handle, uint32_t crtc_id,
>
>  int cursor_start(void)
>  {
> -       /* setup signal handler to update cursor: */
> -       signal(SIGALRM, run_step);
> +       cursor_running = 1;
> +       pthread_create(&cursor_thread, NULL, cursor_thread_func, NULL);
>         printf("starting cursor\n");
> -       run_step(SIGALRM);
>         return 0;
>  }
>
>  int cursor_stop(void)
>  {
> -       signal(SIGALRM, NULL);
> +       cursor_running = 0;
> +       pthread_join(cursor_thread, NULL);
>         printf("cursor stopped\n");
>         return 0;
>  }
> --
> 2.1.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel


More information about the dri-devel mailing list