app/testeventdev: add signal handler
authorJerin Jacob <jerin.jacob@caviumnetworks.com>
Tue, 4 Jul 2017 04:53:06 +0000 (10:23 +0530)
committerJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 7 Jul 2017 07:32:37 +0000 (09:32 +0200)
Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
app/test-eventdev/evt_main.c

index 27d0ae6..56cd137 100644 (file)
@@ -34,6 +34,7 @@
 #include <unistd.h>
 #include <signal.h>
 
+#include <rte_atomic.h>
 #include <rte_debug.h>
 #include <rte_eal.h>
 #include <rte_eventdev.h>
 struct evt_options opt;
 struct evt_test *test;
 
+static void
+signal_handler(int signum)
+{
+       if (signum == SIGINT || signum == SIGTERM) {
+               printf("\nSignal %d received, preparing to exit...\n",
+                               signum);
+               /* request all lcores to exit from the main loop */
+               *(int *)test->test_priv = true;
+               rte_wmb();
+
+               rte_eal_mp_wait_lcore();
+
+               if (test->ops.eventdev_destroy)
+                       test->ops.eventdev_destroy(test, &opt);
+
+               if (test->ops.ethdev_destroy)
+                       test->ops.ethdev_destroy(test, &opt);
+
+               if (test->ops.mempool_destroy)
+                       test->ops.mempool_destroy(test, &opt);
+
+               if (test->ops.test_destroy)
+                       test->ops.test_destroy(test, &opt);
+
+               /* exit with the expected status */
+               signal(signum, SIG_DFL);
+               kill(getpid(), signum);
+       }
+}
 
 static inline void
 evt_options_dump_all(struct evt_test *test, struct evt_options *opts)
@@ -59,6 +89,9 @@ main(int argc, char **argv)
        uint8_t evdevs;
        int ret;
 
+       signal(SIGINT, signal_handler);
+       signal(SIGTERM, signal_handler);
+
        ret = rte_eal_init(argc, argv);
        if (ret < 0)
                rte_panic("invalid EAL arguments\n");