Andreas Färber <[email protected]> writes:
> Use new qemu_for_each_cpu().
>
> Signed-off-by: Andreas Färber <[email protected]>
> ---
> monitor.c | 27 +++++++++++++++++++--------
> 1 file changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/monitor.c b/monitor.c
> index 9be515c..f37bf3d 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -1803,21 +1803,32 @@ static void do_info_mtree(Monitor *mon, const QDict
> *qdict)
> mtree_info((fprintf_function)monitor_printf, mon);
> }
>
> +typedef struct DoInfoNUMAData {
> + Monitor *mon;
> + int numa_node;
> +} DoInfoNUMAData;
> +
> +static void do_info_numa_one(CPUState *cpu, void *data)
> +{
> + DoInfoNUMAData *s = data;
> +
> + if (cpu->numa_node == s->numa_node) {
> + monitor_printf(s->mon, " %d", cpu->cpu_index);
> + }
> +}
> +
> static void do_info_numa(Monitor *mon, const QDict *qdict)
> {
> int i;
> - CPUArchState *env;
> - CPUState *cpu;
> + DoInfoNUMAData s = {
> + .mon = mon,
> + };
>
> monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
> for (i = 0; i < nb_numa_nodes; i++) {
> monitor_printf(mon, "node %d cpus:", i);
> - for (env = first_cpu; env != NULL; env = env->next_cpu) {
> - cpu = ENV_GET_CPU(env);
> - if (cpu->numa_node == i) {
> - monitor_printf(mon, " %d", cpu->cpu_index);
> - }
> - }
> + s.numa_node = i;
> + qemu_for_each_cpu(do_info_numa_one, &s);
> monitor_printf(mon, "\n");
> monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
> node_mem[i] >> 20);
This again demonstrates the relative clunkiness of higher order
functions in C. Control flow jumps back and forth in the source
(lambda, how I miss you), you need an extra type, and you need to go
around the type system.
In my experience, loops are a much more natural fit for C.
Would it be possible to have a function cpu_next(CPUState *)? So you
can simply do:
for (cpu = cpu_next(NULL); cpu; cpu = cpu_next(cpu) {
if (cpu->numa_node == i) {
monitor_printf(mon, " %d", cpu->cpu_index);
}
}
Simple and type safe.
Precedence: bdrv_next().