The tailq list options from commandline require initialization before being used. This was being done by explicitly initing those values in the collate function. A better option is to do so using macros at time of structure definition, that way, adding a new list option does not require any other code changes to initialize it.
Since we are now including the same header 3 times, and need to undefine the macros between inclusions, we simplify things by just doing the undef calls at the end of the included header. Signed-off-by: Bruce Richardson <[email protected]> --- lib/eal/common/eal_common_options.c | 30 ++++++++++++----------------- lib/eal/common/eal_option_list.h | 7 +++++++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c index a29c84c675..8e17230c37 100644 --- a/lib/eal/common/eal_common_options.c +++ b/lib/eal/common/eal_common_options.c @@ -74,9 +74,19 @@ struct eal_init_args { #define INCLUDE_ALL_ARG 1 /* for struct definition, include even unsupported values */ #include "eal_option_list.h" -#undef INCLUDE_ALL_ARG }; -struct eal_init_args args; + +/* define the structure itself, with initializers. Only the LIST_ARGS need init */ +#define LIST_ARG(long, short, help_str, fieldname) .fieldname = TAILQ_HEAD_INITIALIZER(args.fieldname), +#define STR_ARG(long, short, help_str, fieldname) +#define OPT_STR_ARG(long, short, help_str, fieldname) +#define BOOL_ARG(long, short, help_str, fieldname) +#define STR_ALIAS(long, short, help_str, fieldname) + +struct eal_init_args args = { + #include "eal_option_list.h" +}; +#undef INCLUDE_ALL_ARG /* an rte_argparse callback to append the argument to an arg_list * in args. The index is the offset into the struct of the list. @@ -109,13 +119,6 @@ eal_usage(const struct rte_argparse *obj) rte_application_usage_hook(obj->prog_name); } -/* undef the *_ARG macros before redefining to generate the argparse arg list */ -#undef LIST_ARG -#undef STR_ARG -#undef OPT_STR_ARG -#undef BOOL_ARG -#undef STR_ALIAS - /* For arguments which have an arg_list type, they use callback (no val_saver), * require a value, and have the SUPPORT_MULTI flag. */ @@ -217,15 +220,6 @@ eal_collate_args(int argc, char **argv) if (argc < 1 || argv == NULL || argv[0] == NULL) return -EINVAL; - /* initialize the list of arguments */ - memset(&args, 0, sizeof(args)); - TAILQ_INIT(&args.allow); - TAILQ_INIT(&args.block); - TAILQ_INIT(&args.driver_path); - TAILQ_INIT(&args.log_level); - TAILQ_INIT(&args.trace); - TAILQ_INIT(&args.vdev); - /* parse the arguments */ eal_argparse.prog_name = argv[0]; int retval = rte_argparse_parse(&eal_argparse, argc, argv); diff --git a/lib/eal/common/eal_option_list.h b/lib/eal/common/eal_option_list.h index 6a0c501680..f5c21c8376 100644 --- a/lib/eal/common/eal_option_list.h +++ b/lib/eal/common/eal_option_list.h @@ -88,3 +88,10 @@ STR_ALIAS("--socket-limit", NULL, "Alias for --numa-limit", numa_limit) STR_ARG("--vfio-intr", NULL, "VFIO interrupt mode (legacy|msi|msix)", vfio_intr) STR_ARG("--vfio-vf-token", NULL, "VF token (UUID) shared between SR-IOV PF and VFs", vfio_vf_token) #endif + +/* undefine all used defines */ +#undef LIST_ARG +#undef STR_ARG +#undef OPT_STR_ARG +#undef BOOL_ARG +#undef STR_ALIAS -- 2.48.1

