[PATCH 2/6] app/testpmd: register driver specific commands

Ferruh Yigit ferruh.yigit at amd.com
Tue May 24 13:43:53 CEST 2022


On 5/24/2022 11:53 AM, David Marchand wrote:
> [CAUTION: External Email]
> 
> On Mon, May 23, 2022 at 8:10 PM Ferruh Yigit <ferruh.yigit at amd.com> wrote:
>>
>> On 5/23/2022 8:10 AM, David Marchand wrote:
>>> +int
>>> +init_cmdline(void)
>>> +{
>>> +       struct testpmd_commands *c;
>>> +       cmdline_parse_ctx_t *ctx;
>>> +       unsigned int count = 0;
>>> +       unsigned int i;
>>> +
>>> +       /* initialize non-constant commands */
>>> +       cmd_set_fwd_mode_init();
>>> +       cmd_set_fwd_retry_mode_init();
>>> +
>>> +       main_ctx = NULL;
>>> +       for (i = 0; builtin_ctx[i] != NULL; i++) {
>>> +               ctx = realloc(main_ctx, (count + i + 1) * sizeof(*ctx));
>>> +               if (ctx == NULL)
>>> +                       goto err;
>>> +               main_ctx = ctx;
>>
>> Instead of 'realloc()', check and assign pointer in each entry, what do
>> you think about first calculate the size and alloc once, both for
>> 'builtin_ctx' & driver specific command?
>> But of course trade off is to loop twice in that case.
> 
> Yes, I hesitated because of the duplicated loop (and I found no
> "elegant" macro).
> I'm ok with the suggestion, this makes the code simpler.
> 
> 
> int
> init_cmdline(void)
> {
>          struct testpmd_commands *c;
>          unsigned int count;
>          unsigned int i;
> 
>          /* initialize non-constant commands */
>          cmd_set_fwd_mode_init();
>          cmd_set_fwd_retry_mode_init();
> 
>          count = 0;
>          for (i = 0; builtin_ctx[i] != NULL; i++, count++)
>                  ;
>          TAILQ_FOREACH(c, &commands_head, next) {
>                  for (i = 0; c->commands[i].ctx != NULL; i++, count++)
>                          ;
>          }
> 
>          /* cmdline expects a NULL terminated array */
>          main_ctx = calloc(count + 1, sizeof(main_ctx[0]));
>          if (main_ctx == NULL)
>                  return -1;
> 
>          count = 0;
>          for (i = 0; builtin_ctx[i] != NULL; i++, count++)
>                  main_ctx[count] = builtin_ctx[i];
>          TAILQ_FOREACH(c, &commands_head, next) {
>                  for (i = 0; c->commands[i].ctx != NULL; i++, count++)
>                          main_ctx[count] = c->commands[i].ctx;
>          }
> 
>          return 0;
> }
> 

ack



More information about the dev mailing list