On 07/17/13 16:44, Paolo Bonzini wrote: > Il 17/07/2013 16:33, Laszlo Ersek ha scritto: >>>>>> opts-visitor can handle lists of simple scalar types. Ie. it can do >>>>>> -numa node,nodeid=3,cpus=3-4,cpus=9-10. It can't save the parsing of >>>>>> intervals (eg. 3-4). >>>> >>>> Saving the parsing of intervals is not necessary for this use case. So >>>> if we can make it '*cpus':['int'], we should. >>>> >>>> But is it the opts-visitor "can handle" lists of integers, or does code >>>> have to be written? If the latter, can you whip up a prototype? >> No extra code needs to be written. The current use case is >> NetdevUserOptions.{dnssearch,hostfwd,guestfwd}; see commit 094f15c5, and >> (by Klaus Stengel) commit 63d2960b. > > This is to handle lists, but want about converting > > cpus=3-4,cpus=9-10 > > to > > 'cpus': [3,4,9,10]
Oh, that. :) That does need extra code. Something along the lines of: (a), in the JSON, reuse the existing String wrapper type, and make "cpus" an optional list of String[s]: { 'type': 'NumaNodeOptions', 'data': { '*nodeid': 'uint16', '*cpus': ['String'] }} (b) in the code, traverse the StringList like net_init_slirp_configs() or slirp_dnssearch() does. Parse each element as an interval, set bit ranges / report errors. static int numa_node_parse_cpu_range(int nodeid, const char *cpu_range) { /* what numa_node_parse_cpus() does in 02/12 */ } static int numa_node_parse(const NumaNodeOptions *opts) { const StringList *cpu_range; /* not sure how to handle the (!opts->has_nodeid) case; let's * assume we have a nodeid here */ if (opts->nodeid >= MAX_NODES) { fprintf(stderr, "NUMA nodeid %d reaches / exceeds maximum %d\n", opts->nodeid, MAX_NODES); return -1; } for (cpu_range = opts->cpus; cpu_range != NULL; cpu_range = cpu_range->next) { int ret; ret = numa_node_parse_cpu_range(opts->nodeid, cpu_range->value->str); if (ret < 0) { return ret; } } return 0; } Did you mean something like this by prototype? Thanks, Laszlo