Avi Kivity <a...@redhat.com> writes: > On 10/04/2012 04:05 PM, Anthony Liguori wrote: >> Avi Kivity <a...@redhat.com> writes: >> >>> Many listeners don't need to respond to all MemoryListener callbacks; >>> provide suitable defaults instead. >>> > >>> +#define MEMORY_LISTENER_DEFAULT_OPS \ >>> + .begin = memory_listener_default_global, \ >>> + .commit = memory_listener_default_global, \ >>> + .region_add = memory_listener_default_section, \ >>> + .region_del = memory_listener_default_section, \ >>> + .region_nop = memory_listener_default_section, \ >>> + .log_start = memory_listener_default_section, \ >>> + .log_stop = memory_listener_default_section, \ >>> + .log_sync = memory_listener_default_section, \ >>> + .log_global_start = memory_listener_default_global, \ >>> + .log_global_stop = memory_listener_default_global, \ >>> + .eventfd_add = memory_listener_default_eventfd, \ >>> + .eventfd_del = memory_listener_default_eventfd \ >>> + >>> +void memory_listener_default_global(MemoryListener *listener); >>> +void memory_listener_default_section(MemoryListener *listener, >>> + MemoryRegionSection *section); >>> +void memory_listener_default_eventfd(MemoryListener *listener, >>> + MemoryRegionSection *section, >>> + bool match_data, uint64_t data, >>> EventNotifier *e); >>> + >>> /** >>> * memory_region_init: Initialize a memory region >>> * >> >> I think it'd be nicer to check for NULL when invoking the functions in >> the memory core. >> >> Then you avoid the exported stub functions entirely. > > Yes, that's the common style, but I happen not to like the extra check, > both from a performance point of view (doesn't apply here of course) and > from a readability point of view.
The trouble with your approach is that it introduced a subtle behavior based on ordering. IOW: MemoryListenerOps foo = { MEMORY_LISTENER_DEFAULT_OPS, .log_sync = ..., }; vs. MemoryListenerOps foo = { .log_sync = ..., MEMORY_LISTENER_DEFAULT_OPS, }; Both compile fine but have potentially difficult to debug differences. Relying on zero-initialization eliminates the possibility of this problem. Regards, Anthony Liguori > > -- > error compiling committee.c: too many arguments to function