test_console: React on SIGINT
authorDavid Herrmann <dh.herrmann@googlemail.com>
Fri, 2 Dec 2011 13:35:33 +0000 (14:35 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Fri, 2 Dec 2011 13:35:33 +0000 (14:35 +0100)
Correctly terminate the application on SIGINT so the CRTC gets reset.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
tests/test_console.c

index 43d18eb..eb70463 100644 (file)
 #include <errno.h>
 #include <inttypes.h>
 #include <locale.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 
 #include <GL/gl.h>
 #include "console.h"
 #include "output.h"
 
+static volatile sig_atomic_t terminate;
+
+static void sig_term(int sig)
+{
+       terminate = 1;
+}
+
 static int map_outputs(struct kmscon_compositor *comp,
                                                struct kmscon_console *con)
 {
@@ -82,7 +91,6 @@ static int map_outputs(struct kmscon_compositor *comp,
                                                                iter, ret);
                        continue;
                }
-               sleep(1);
        }
 
        return 0;
@@ -134,12 +142,14 @@ static int run_console(struct kmscon_compositor *comp)
                goto err_unref;
        }
 
-       while (1) {
+       while (!terminate) {
                kmscon_console_draw(con);
                map_outputs(comp, con);
                usleep(10000);
        }
 
+       printf("Terminating due to user request\n");
+
 err_unref:
        kmscon_console_unref(con);
        return ret;
@@ -149,9 +159,15 @@ int main(int argc, char **argv)
 {
        struct kmscon_compositor *comp;
        int ret;
+       struct sigaction sig;
 
        setlocale(LC_ALL, "");
 
+       memset(&sig, 0, sizeof(sig));
+       sig.sa_handler = sig_term;
+       sigaction(SIGTERM, &sig, NULL);
+       sigaction(SIGINT, &sig, NULL);
+
        ret = kmscon_compositor_new(&comp);
        if (ret) {
                printf("Cannot create compositor: %d\n", ret);