From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:50037) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rv9Re-00013n-GQ for qemu-devel@nongnu.org; Wed, 08 Feb 2012 10:28:35 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rv9RT-00005u-2f for qemu-devel@nongnu.org; Wed, 08 Feb 2012 10:28:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:57165) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rv9RS-00005f-R0 for qemu-devel@nongnu.org; Wed, 08 Feb 2012 10:28:19 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q18FSIJW010313 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 8 Feb 2012 10:28:18 -0500 Received: from cleopatra.tlv.redhat.com (cleopatra.tlv.redhat.com [10.35.255.11]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q18FSHVG030293 for ; Wed, 8 Feb 2012 10:28:17 -0500 From: Avi Kivity Date: Wed, 8 Feb 2012 17:27:52 +0200 Message-Id: <1328714879-18906-4-git-send-email-avi@redhat.com> In-Reply-To: <1328714879-18906-1-git-send-email-avi@redhat.com> References: <1328714879-18906-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH 03/10] memory: add shorthand for invoking a callback on all listeners List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Avi Kivity --- memory.c | 54 +++++++++++++++++++----------------------------------- 1 files changed, 19 insertions(+), 35 deletions(-) diff --git a/memory.c b/memory.c index 382dded..6afe414 100644 --- a/memory.c +++ b/memory.c @@ -678,31 +678,23 @@ static void address_space_update_ioeventfds(AddressSpace *as) as->ioeventfd_nb = ioeventfd_nb; } -typedef void ListenerCallback(MemoryListener *listener, - MemoryRegionSection *mrs); - -/* Want "void (&MemoryListener::*callback)(const MemoryRegionSection& s)" */ -static void memory_listener_update_region(FlatRange *fr, AddressSpace *as, - size_t callback_offset) -{ - MemoryRegionSection section = { - .mr = fr->mr, - .address_space = as->root, - .offset_within_region = fr->offset_in_region, - .size = int128_get64(fr->addr.size), - .offset_within_address_space = int128_get64(fr->addr.start), - }; - MemoryListener *listener; - - QLIST_FOREACH(listener, &memory_listeners, link) { - ListenerCallback *callback - = *(ListenerCallback **)((void *)listener + callback_offset); - callback(listener, §ion); - } -} - -#define MEMORY_LISTENER_UPDATE_REGION(fr, as, callback) \ - memory_listener_update_region(fr, as, offsetof(MemoryListener, callback)) +#define MEMORY_LISTENER_CALL(_callback, _args...) \ + do { \ + MemoryListener *_listener; \ + \ + QLIST_FOREACH(_listener, &memory_listeners, link) { \ + _listener->_callback(_listener, ##_args); \ + } \ + } while (0) + +#define MEMORY_LISTENER_UPDATE_REGION(fr, as, callback) \ + MEMORY_LISTENER_CALL(callback, &(MemoryRegionSection) { \ + .mr = (fr)->mr, \ + .address_space = (as)->root, \ + .offset_within_region = (fr)->offset_in_region, \ + .size = int128_get64((fr)->addr.size), \ + .offset_within_address_space = int128_get64((fr)->addr.start), \ + }) static void address_space_update_topology_pass(AddressSpace *as, FlatView old_view, @@ -1483,23 +1475,15 @@ void memory_global_sync_dirty_bitmap(MemoryRegion *address_space) void memory_global_dirty_log_start(void) { - MemoryListener *listener; - cpu_physical_memory_set_dirty_tracking(1); global_dirty_log = true; - QLIST_FOREACH(listener, &memory_listeners, link) { - listener->log_global_start(listener); - } + MEMORY_LISTENER_CALL(log_global_start); } void memory_global_dirty_log_stop(void) { - MemoryListener *listener; - global_dirty_log = false; - QLIST_FOREACH(listener, &memory_listeners, link) { - listener->log_global_stop(listener); - } + MEMORY_LISTENER_CALL(log_global_stop); cpu_physical_memory_set_dirty_tracking(0); } -- 1.7.9