On Wed, May 03, 2017 at 02:38:41PM -0300, Eduardo Habkost wrote: > On Wed, May 03, 2017 at 11:39:10AM -0500, Eric Blake wrote: > > On 05/03/2017 11:35 AM, Eduardo Habkost wrote: > > > > >> + > > >> + memset(&cpu, 0, sizeof(cpu)); > > >> + cpu.has_node_id = object->u.cpu.has_node_id; > > >> + cpu.node_id = object->u.cpu.node_id; > > >> + cpu.has_socket_id = object->u.cpu.has_socket_id; > > >> + cpu.socket_id = object->u.cpu.socket_id; > > >> + cpu.has_core_id = object->u.cpu.has_core_id; > > >> + cpu.core_id = object->u.cpu.core_id; > > >> + cpu.has_thread_id = object->u.cpu.has_thread_id; > > >> + cpu.thread_id = object->u.cpu.thread_id; > > > > > > We don't have a way to avoid copying each field individually? > > > Some visitor trick, maybe? > > > > > > Eric, Markus, Michael, do you have any suggestions? > > > > Markus just added QAPI_CLONE_MEMBERS(), which sounds like what you want: > > > > https://lists.gnu.org/archive/html/qemu-devel/2017-04/msg04867.html > > Not sure if it would work in this case. Note that cpu and > object->u.cpu have different types. 'cpu' is CpuInstanceProps, > but object->u.cpu is NodeCpuOptions. > > NodeCpuOptions has { 'base': 'CpuInstanceProps' }, and > CpuInstanceProps field declarations are duplicated in struct > NodeCpuOptions. Do you know why struct inheritance is implemented > by duplicating the fields of the base struct instead of embedding > the base struct?
Nevermind, I just found out that QAPI generates a qapi_NumaCpuOptions_base() upcast helper. So this can be solved with no data copying at all: machine_set_cpu_numa_nodes(ms, qapi_NumaCpuOptions_base(&object->u.cpu), &err); -- Eduardo