DPDK patches and discussions
 help / color / mirror / Atom feed
* [RFT] test-pmd: go back to using cmdline_interact
@ 2023-03-13 17:19 Stephen Hemminger
  2023-03-13 21:38 ` [RFT v2] " Stephen Hemminger
                   ` (3 more replies)
  0 siblings, 4 replies; 28+ messages in thread
From: Stephen Hemminger @ 2023-03-13 17:19 UTC (permalink / raw)
  To: dev
  Cc: Stephen Hemminger, Aman Singh, Yuying Zhang, Olivier Matz, Ferruh Yigit

The cmdline library poll function is broken on Windows
and was never tested, don't use it.

Instead, use sigaction() to cancel read character on Unix OS's
and a new helper to cancel I/O on Windows.

Fixes: 0fd1386c30c3 ("app/testpmd: cleanup cleanly from signal")
Bugzilla ID: 1180
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 app/test-pmd/cmdline.c | 27 ++++++++++++++-------------
 app/test-pmd/testpmd.c | 11 +++++++++++
 lib/cmdline/cmdline.c  | 16 ++++++++++++++++
 lib/cmdline/cmdline.h  |  1 +
 4 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index 6fa870dc329b..072437d9bfcf 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -66,6 +66,7 @@
 #include "cmdline_tm.h"
 #include "bpf_cmd.h"
 
+static struct cmdline *testpmd_cl;
 static cmdline_parse_ctx_t *main_ctx;
 static TAILQ_HEAD(, testpmd_driver_commands) driver_commands_head =
 	TAILQ_HEAD_INITIALIZER(driver_commands_head);
@@ -13028,26 +13029,26 @@ cmdline_read_from_file(const char *filename)
 	printf("Read CLI commands from %s\n", filename);
 }
 
+void
+prompt_exit(void)
+{
+	cmdline_cancel(testpmd_cl);
+	cmdline_quit(testpmd_cl);
+}
+
 /* prompt function, called from main on MAIN lcore */
 void
 prompt(void)
 {
-	struct cmdline *cl;
-
-	cl = cmdline_stdin_new(main_ctx, "testpmd> ");
-	if (cl == NULL)
+	testpmd_cl = cmdline_stdin_new(main_ctx, "testpmd> ");
+	if (testpmd_cl == NULL) {
+		fprintf(stderr,
+			"Failed to create stdin based cmdline context\n");
 		return;
-
-	/* loop until signal or quit command */
-	while (f_quit == 0 && cl_quit == 0) {
-		int status = cmdline_poll(cl);
-
-		if (status < 0 || status == RDLINE_EXITED)
-			break;
 	}
 
-	cmdline_quit(cl);
-	cmdline_stdin_exit(cl);
+	cmdline_interact(testpmd_cl);
+	cmdline_stdin_exit(testpmd_cl);
 }
 
 void
diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
index 2ce19ed47ab4..5cb6f9252395 100644
--- a/app/test-pmd/testpmd.c
+++ b/app/test-pmd/testpmd.c
@@ -4469,6 +4469,7 @@ static void
 signal_handler(int signum __rte_unused)
 {
 	f_quit = 1;
+	prompt_exit();
 }
 
 int
@@ -4479,8 +4480,18 @@ main(int argc, char** argv)
 	uint16_t count;
 	int ret;
 
+#ifdef RTE_EXEC_ENV_WINDOWS
 	signal(SIGINT, signal_handler);
 	signal(SIGTERM, signal_handler);
+#else
+	/* Want read() not to be restarted on signal */
+	struct sigaction action = {
+		.sa_handler = signal_handler,
+	};
+
+	sigaction(SIGINT, &action, NULL);
+	sigaction(SIGTERM, &action, NULL);
+#endif
 
 	testpmd_logtype = rte_log_register("testpmd");
 	if (testpmd_logtype < 0)
diff --git a/lib/cmdline/cmdline.c b/lib/cmdline/cmdline.c
index 8ad0690d8533..69b3d9827290 100644
--- a/lib/cmdline/cmdline.c
+++ b/lib/cmdline/cmdline.c
@@ -176,6 +176,22 @@ cmdline_quit(struct cmdline *cl)
 	rdline_quit(&cl->rdl);
 }
 
+void
+cmdline_cancel(struct cmdline *cl)
+{
+	if (!cl)
+		return;
+
+#ifdef RTE_EXEC_ENV_WINDOWS
+	/* force the outstanding read on console to exit */
+	if (cl->oldterm.is_console_input) {
+		HANDLE handle = (HANDLE)_get_osfhandle(cl->s_in);
+
+		CancelIoEx(handle, NULL);
+	}
+#endif
+}
+
 int
 cmdline_poll(struct cmdline *cl)
 {
diff --git a/lib/cmdline/cmdline.h b/lib/cmdline/cmdline.h
index b14355ef5121..7dac90cfe7eb 100644
--- a/lib/cmdline/cmdline.h
+++ b/lib/cmdline/cmdline.h
@@ -58,6 +58,7 @@ cmdline_get_rdline(struct cmdline *cl);
 int cmdline_poll(struct cmdline *cl);
 
 void cmdline_interact(struct cmdline *cl);
+void cmdline_cancel(struct cmdline *cl);
 void cmdline_quit(struct cmdline *cl);
 
 #ifdef __cplusplus
-- 
2.39.2


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2023-03-19 23:29 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-13 17:19 [RFT] test-pmd: go back to using cmdline_interact Stephen Hemminger
2023-03-13 21:38 ` [RFT v2] " Stephen Hemminger
2023-03-14  7:06   ` Ling, WeiX
     [not found]   ` <MW4PR12MB56684FA660218F925D64BE09A4BE9@MW4PR12MB5668.namprd12.prod.outlook.com>
2023-03-14 12:07     ` Pier Damouny
2023-03-14 17:36 ` [PATCH v3 0/3] testpmd control C fixes Stephen Hemminger
2023-03-14 17:36   ` [PATCH v3 1/3] testpmd: go back to using cmdline_interact Stephen Hemminger
2023-03-14 17:36   ` [PATCH v3 2/3] testpmd: use sig_atomic_t for flag Stephen Hemminger
2023-03-15 16:31     ` Stephen Hemminger
2023-03-14 17:36   ` [PATCH v3 3/3] testpmd: enable interrupt in interactive mode Stephen Hemminger
2023-03-14 22:40   ` [PATCH v3 0/3] testpmd control C fixes Stephen Hemminger
2023-03-15  9:46     ` David Marchand
2023-03-15 17:31 ` [PATCH v4 0/2] Fix testpmd interrupt regression Stephen Hemminger
2023-03-15 17:31   ` [PATCH v4 1/2] testpmd: go back to using cmdline_interact Stephen Hemminger
2023-03-17 16:20     ` Olivier Matz
2023-03-17 16:38       ` Stephen Hemminger
2023-03-15 17:31   ` [PATCH v4 2/2] testpmd: enable interrupt in interactive mode Stephen Hemminger
2023-03-17 16:20     ` Olivier Matz
2023-03-17 16:25       ` Stephen Hemminger
2023-03-16  8:16   ` [PATCH v4 0/2] Fix testpmd interrupt regression Pier Damouny
2023-03-16 12:20   ` Ferruh Yigit
2023-03-16 15:31     ` Stephen Hemminger
2023-03-16 17:01       ` Ferruh Yigit
2023-03-16 17:05         ` Thomas Monjalon
2023-03-16 17:36           ` Ferruh Yigit
2023-03-16 17:27   ` [PATCH] app/testpmd: revert cleanup cleanly from signal Ferruh Yigit
2023-03-17 16:59 ` [PATCH v5] testpmd: go back to using cmdline_interact Stephen Hemminger
2023-03-17 21:12   ` Olivier Matz
2023-03-19 23:28     ` Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).