[dpdk-dev,2/2] cmdline: add polling mode for command line
Commit Message
This patch adds the ability to process console input in the same thread
as packet processing by using poll() function.
Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
---
lib/librte_cmdline/cmdline.c | 35 ++++++++++++++++++++++++++++++
lib/librte_cmdline/cmdline.h | 1 +
lib/librte_cmdline/rte_cmdline_version.map | 1 +
3 files changed, 37 insertions(+)
Comments
Hi Pawel,
On 05/12/2015 01:10 PM, Pawel Wodkowski wrote:
> This patch adds the ability to process console input in the same thread
> as packet processing by using poll() function.
>
> Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
> [...]
> --- a/lib/librte_cmdline/cmdline.h
> +++ b/lib/librte_cmdline/cmdline.h
> @@ -84,6 +84,7 @@ void cmdline_printf(const struct cmdline *cl, const char *fmt, ...)
> __attribute__((format(printf,2,3)));
> int cmdline_in(struct cmdline *cl, const char *buf, int size);
> int cmdline_write_char(struct rdline *rdl, char c);
> +int cmdline_poll(struct cmdline *cl);
> void cmdline_interact(struct cmdline *cl);
> void cmdline_quit(struct cmdline *cl);
>
> diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
> index 6193462..df55def 100644
I know the rest of the file does not document the functions
prototypes, but I think it could be helpful to add doxygen-style
comments for new functions.
> diff --git a/lib/librte_cmdline/rte_cmdline_version.map b/lib/librte_cmdline/rte_cmdline_version.map
> index 6193462..df55def 100644
> --- a/lib/librte_cmdline/rte_cmdline_version.map
> +++ b/lib/librte_cmdline/rte_cmdline_version.map
> @@ -40,6 +40,7 @@ DPDK_2.0 {
> cmdline_parse_num;
> cmdline_parse_portlist;
> cmdline_parse_string;
> + cmdline_poll;
> cmdline_printf;
> cmdline_quit;
> cmdline_set_prompt;
>
I'm not sure the .map should be modified like this, instead I
would have added a new DPDK_2.1 section, like I did for this
commit (reviewed by Neil):
http://dpdk.org/browse/dpdk/commit/?id=bbd778248985e542175e9b4ce560f2d379e78c4e
By the way, the following link is a good documentation about the
.map files:
http://people.freebsd.org/~deischen/symver/freebsd_versioning.txt
Regards,
Olivier
On 2015-05-12 16:36, Olivier MATZ wrote:
> Hi Pawel,
>
> On 05/12/2015 01:10 PM, Pawel Wodkowski wrote:
>> This patch adds the ability to process console input in the same thread
>> as packet processing by using poll() function.
>>
>> Signed-off-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
>> [...]
>> --- a/lib/librte_cmdline/cmdline.h
>> +++ b/lib/librte_cmdline/cmdline.h
>> @@ -84,6 +84,7 @@ void cmdline_printf(const struct cmdline *cl, const
>> char *fmt, ...)
>> __attribute__((format(printf,2,3)));
>> int cmdline_in(struct cmdline *cl, const char *buf, int size);
>> int cmdline_write_char(struct rdline *rdl, char c);
>> +int cmdline_poll(struct cmdline *cl);
>> void cmdline_interact(struct cmdline *cl);
>> void cmdline_quit(struct cmdline *cl);
>>
>> diff --git a/lib/librte_cmdline/rte_cmdline_version.map
>> b/lib/librte_cmdline/rte_cmdline_version.map
>> index 6193462..df55def 100644
>
> I know the rest of the file does not document the functions
> prototypes, but I think it could be helpful to add doxygen-style
> comments for new functions.
Yes, no problem.
>
>> diff --git a/lib/librte_cmdline/rte_cmdline_version.map
>> b/lib/librte_cmdline/rte_cmdline_version.map
>> index 6193462..df55def 100644
>> --- a/lib/librte_cmdline/rte_cmdline_version.map
>> +++ b/lib/librte_cmdline/rte_cmdline_version.map
>> @@ -40,6 +40,7 @@ DPDK_2.0 {
>> cmdline_parse_num;
>> cmdline_parse_portlist;
>> cmdline_parse_string;
>> + cmdline_poll;
>> cmdline_printf;
>> cmdline_quit;
>> cmdline_set_prompt;
>>
>
> I'm not sure the .map should be modified like this, instead I
> would have added a new DPDK_2.1 section, like I did for this
> commit (reviewed by Neil):
> http://dpdk.org/browse/dpdk/commit/?id=bbd778248985e542175e9b4ce560f2d379e78c4e
>
>
> By the way, the following link is a good documentation about the
> .map files:
> http://people.freebsd.org/~deischen/symver/freebsd_versioning.txt
Thank you, I will follow those instructions :)
Please check v2 I will send shortly.
@@ -65,6 +65,7 @@
#include <stdarg.h>
#include <inttypes.h>
#include <fcntl.h>
+#include <poll.h>
#include <errno.h>
#include <termios.h>
#include <netinet/in.h>
@@ -246,6 +247,40 @@ cmdline_quit(struct cmdline *cl)
rdline_quit(&cl->rdl);
}
+int
+cmdline_poll(struct cmdline *cl)
+{
+ struct pollfd pfd;
+ int status;
+ ssize_t read_status;
+ char c;
+
+ if (!cl)
+ return -EINVAL;
+ else if (cl->rdl.status == RDLINE_EXITED)
+ return RDLINE_EXITED;
+
+ pfd.fd = cl->s_in;
+ pfd.events = POLLIN;
+ pfd.revents = 0;
+
+ status = poll(&pfd, 1, 0);
+ if (status < 0)
+ return status;
+ else if (status > 0) {
+ c = -1;
+ read_status = read(cl->s_in, &c, 1);
+ if (read_status < 0)
+ return read_status;
+
+ status = cmdline_in(cl, &c, 1);
+ if (status < 0 && cl->rdl.status != RDLINE_EXITED)
+ return status;
+ }
+
+ return cl->rdl.status;
+}
+
void
cmdline_interact(struct cmdline *cl)
{
@@ -84,6 +84,7 @@ void cmdline_printf(const struct cmdline *cl, const char *fmt, ...)
__attribute__((format(printf,2,3)));
int cmdline_in(struct cmdline *cl, const char *buf, int size);
int cmdline_write_char(struct rdline *rdl, char c);
+int cmdline_poll(struct cmdline *cl);
void cmdline_interact(struct cmdline *cl);
void cmdline_quit(struct cmdline *cl);
@@ -40,6 +40,7 @@ DPDK_2.0 {
cmdline_parse_num;
cmdline_parse_portlist;
cmdline_parse_string;
+ cmdline_poll;
cmdline_printf;
cmdline_quit;
cmdline_set_prompt;