From patchwork Wed Feb 3 15:47:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Hajnoczi X-Patchwork-Id: 8204431 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 9AE699F38B for ; Wed, 3 Feb 2016 15:53:19 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 39A25201C0 for ; Wed, 3 Feb 2016 15:53:18 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 96606200DF for ; Wed, 3 Feb 2016 15:53:16 +0000 (UTC) Received: from localhost ([::1]:35776 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQzk4-00012T-1s for patchwork-qemu-devel@patchwork.kernel.org; Wed, 03 Feb 2016 10:53:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33793) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQzf8-0001Em-GA for qemu-devel@nongnu.org; Wed, 03 Feb 2016 10:48:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aQzf5-0002Ze-PD for qemu-devel@nongnu.org; Wed, 03 Feb 2016 10:48:10 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50210) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aQzf5-0002ZP-Cn for qemu-devel@nongnu.org; Wed, 03 Feb 2016 10:48:07 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id F39F48050B; Wed, 3 Feb 2016 15:48:06 +0000 (UTC) Received: from localhost (ovpn-112-66.ams2.redhat.com [10.36.112.66]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u13Fm5P9030196; Wed, 3 Feb 2016 10:48:06 -0500 From: Stefan Hajnoczi To: Date: Wed, 3 Feb 2016 15:47:41 +0000 Message-Id: <1454514465-11856-10-git-send-email-stefanha@redhat.com> In-Reply-To: <1454514465-11856-1-git-send-email-stefanha@redhat.com> References: <1454514465-11856-1-git-send-email-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: "Denis V. Lunev" , Peter Maydell , Stefan Hajnoczi , Paolo Bonzini Subject: [Qemu-devel] [PULL 09/13] log: do not unnecessarily include qom/cpu.h X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Paolo Bonzini Split the bits that require it to exec/log.h. Signed-off-by: Paolo Bonzini Signed-off-by: Denis V. Lunev Acked-by: Christian Borntraeger Message-id: 1452174932-28657-8-git-send-email-den@openvz.org Signed-off-by: Stefan Hajnoczi --- bsd-user/main.c | 1 + cpu-exec.c | 1 + exec.c | 1 + hw/acpi/cpu_hotplug.c | 1 + hw/timer/a9gtimer.c | 1 + include/exec/log.h | 60 +++++++++++++++++++++++++++++++++++++++++++ include/qemu/log.h | 59 ------------------------------------------ linux-user/main.c | 1 + qom/cpu.c | 1 + target-alpha/translate.c | 1 + target-arm/translate-a64.c | 1 + target-arm/translate.c | 1 + target-cris/translate.c | 1 + target-i386/seg_helper.c | 1 + target-i386/smm_helper.c | 1 + target-i386/translate.c | 1 + target-lm32/helper.c | 1 + target-lm32/translate.c | 1 + target-m68k/translate.c | 1 + target-microblaze/helper.c | 1 + target-microblaze/translate.c | 1 + target-mips/helper.c | 1 + target-mips/translate.c | 1 + target-moxie/translate.c | 1 + target-openrisc/translate.c | 1 + target-ppc/mmu-hash32.c | 1 + target-ppc/mmu-hash64.c | 1 + target-ppc/mmu_helper.c | 1 + target-ppc/translate.c | 1 + target-s390x/translate.c | 1 + target-sh4/helper.c | 1 + target-sh4/translate.c | 1 + target-sparc/int32_helper.c | 1 + target-sparc/int64_helper.c | 1 + target-sparc/translate.c | 1 + target-tilegx/translate.c | 1 + target-tricore/translate.c | 1 + target-unicore32/translate.c | 1 + target-xtensa/translate.c | 1 + tcg/tcg.c | 1 + translate-all.c | 1 + 41 files changed, 99 insertions(+), 59 deletions(-) create mode 100644 include/exec/log.h diff --git a/bsd-user/main.c b/bsd-user/main.c index 1ecaeb5..fefcfc1 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -33,6 +33,7 @@ #include "tcg.h" #include "qemu/timer.h" #include "qemu/envlist.h" +#include "exec/log.h" int singlestep; unsigned long mmap_min_addr; diff --git a/cpu-exec.c b/cpu-exec.c index c459364..fd92452 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -27,6 +27,7 @@ #include "exec/address-spaces.h" #include "qemu/rcu.h" #include "exec/tb-hash.h" +#include "exec/log.h" #if defined(TARGET_I386) && !defined(CONFIG_USER_ONLY) #include "hw/i386/apic.h" #endif diff --git a/exec.c b/exec.c index 9e076bc..ab37360 100644 --- a/exec.c +++ b/exec.c @@ -52,6 +52,7 @@ #include "exec/memory-internal.h" #include "exec/ram_addr.h" +#include "exec/log.h" #include "qemu/range.h" #ifndef _WIN32 diff --git a/hw/acpi/cpu_hotplug.c b/hw/acpi/cpu_hotplug.c index 2f99ec5..5a410a5 100644 --- a/hw/acpi/cpu_hotplug.c +++ b/hw/acpi/cpu_hotplug.c @@ -12,6 +12,7 @@ #include "qemu/osdep.h" #include "hw/hw.h" #include "hw/acpi/cpu_hotplug.h" +#include "qom/cpu.h" static uint64_t cpu_status_read(void *opaque, hwaddr addr, unsigned int size) { diff --git a/hw/timer/a9gtimer.c b/hw/timer/a9gtimer.c index c11a7bc..fa4602c 100644 --- a/hw/timer/a9gtimer.c +++ b/hw/timer/a9gtimer.c @@ -25,6 +25,7 @@ #include "qemu/timer.h" #include "qemu/bitops.h" #include "qemu/log.h" +#include "qom/cpu.h" #ifndef A9_GTIMER_ERR_DEBUG #define A9_GTIMER_ERR_DEBUG 0 diff --git a/include/exec/log.h b/include/exec/log.h new file mode 100644 index 0000000..ba1c9b5 --- /dev/null +++ b/include/exec/log.h @@ -0,0 +1,60 @@ +#ifndef QEMU_EXEC_LOG_H +#define QEMU_EXEC_LOG_H + +#include "qemu/log.h" +#include "qom/cpu.h" +#include "disas/disas.h" + +/* cpu_dump_state() logging functions: */ +/** + * log_cpu_state: + * @cpu: The CPU whose state is to be logged. + * @flags: Flags what to log. + * + * Logs the output of cpu_dump_state(). + */ +static inline void log_cpu_state(CPUState *cpu, int flags) +{ + if (qemu_log_enabled()) { + cpu_dump_state(cpu, qemu_logfile, fprintf, flags); + } +} + +/** + * log_cpu_state_mask: + * @mask: Mask when to log. + * @cpu: The CPU whose state is to be logged. + * @flags: Flags what to log. + * + * Logs the output of cpu_dump_state() if loglevel includes @mask. + */ +static inline void log_cpu_state_mask(int mask, CPUState *cpu, int flags) +{ + if (qemu_loglevel & mask) { + log_cpu_state(cpu, flags); + } +} + +#ifdef NEED_CPU_H +/* disas() and target_disas() to qemu_logfile: */ +static inline void log_target_disas(CPUState *cpu, target_ulong start, + target_ulong len, int flags) +{ + target_disas(qemu_logfile, cpu, start, len, flags); +} + +static inline void log_disas(void *code, unsigned long size) +{ + disas(qemu_logfile, code, size); +} + +#if defined(CONFIG_USER_ONLY) +/* page_dump() output to the log file: */ +static inline void log_page_dump(void) +{ + page_dump(qemu_logfile); +} +#endif +#endif + +#endif diff --git a/include/qemu/log.h b/include/qemu/log.h index d837d90..09722e3 100644 --- a/include/qemu/log.h +++ b/include/qemu/log.h @@ -5,10 +5,6 @@ #include #include #include "qemu/compiler.h" -#include "qom/cpu.h" -#ifdef NEED_CPU_H -#include "disas/disas.h" -#endif /* Private global variables, don't use */ extern FILE *qemu_logfile; @@ -78,61 +74,6 @@ qemu_log_vprintf(const char *fmt, va_list va) void GCC_FMT_ATTR(2, 3) qemu_log_mask(int mask, const char *fmt, ...); -/* Special cases: */ - -/* cpu_dump_state() logging functions: */ -/** - * log_cpu_state: - * @cpu: The CPU whose state is to be logged. - * @flags: Flags what to log. - * - * Logs the output of cpu_dump_state(). - */ -static inline void log_cpu_state(CPUState *cpu, int flags) -{ - if (qemu_log_enabled()) { - cpu_dump_state(cpu, qemu_logfile, fprintf, flags); - } -} - -/** - * log_cpu_state_mask: - * @mask: Mask when to log. - * @cpu: The CPU whose state is to be logged. - * @flags: Flags what to log. - * - * Logs the output of cpu_dump_state() if loglevel includes @mask. - */ -static inline void log_cpu_state_mask(int mask, CPUState *cpu, int flags) -{ - if (qemu_loglevel & mask) { - log_cpu_state(cpu, flags); - } -} - -#ifdef NEED_CPU_H -/* disas() and target_disas() to qemu_logfile: */ -static inline void log_target_disas(CPUState *cpu, target_ulong start, - target_ulong len, int flags) -{ - target_disas(qemu_logfile, cpu, start, len, flags); -} - -static inline void log_disas(void *code, unsigned long size) -{ - disas(qemu_logfile, code, size); -} - -#if defined(CONFIG_USER_ONLY) -/* page_dump() output to the log file: */ -static inline void log_page_dump(void) -{ - page_dump(qemu_logfile); -} -#endif -#endif - - /* Maintenance: */ /* fflush() the log file */ diff --git a/linux-user/main.c b/linux-user/main.c index f8d4577..e719a2d 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -28,6 +28,7 @@ #include "qemu/timer.h" #include "qemu/envlist.h" #include "elf.h" +#include "exec/log.h" char *exec_path; diff --git a/qom/cpu.c b/qom/cpu.c index 8f537a4..38dc713 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -23,6 +23,7 @@ #include "sysemu/kvm.h" #include "qemu/notify.h" #include "qemu/log.h" +#include "exec/log.h" #include "qemu/error-report.h" #include "sysemu/sysemu.h" diff --git a/target-alpha/translate.c b/target-alpha/translate.c index 7d419d9..c96adbb 100644 --- a/target-alpha/translate.c +++ b/target-alpha/translate.c @@ -28,6 +28,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #undef ALPHA_DEBUG_DISAS diff --git a/target-arm/translate-a64.c b/target-arm/translate-a64.c index 80f6c20..2af7d86 100644 --- a/target-arm/translate-a64.c +++ b/target-arm/translate-a64.c @@ -31,6 +31,7 @@ #include "exec/helper-proto.h" #include "exec/helper-gen.h" +#include "exec/log.h" #include "trace-tcg.h" diff --git a/target-arm/translate.c b/target-arm/translate.c index cff511b..3ec758a 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -32,6 +32,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define ENABLE_ARCH_4T arm_dc_feature(s, ARM_FEATURE_V4T) diff --git a/target-cris/translate.c b/target-cris/translate.c index 295005f..0350cb5 100644 --- a/target-cris/translate.c +++ b/target-cris/translate.c @@ -35,6 +35,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define DISAS_CRIS 0 diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c index 4c7cab7..4f26941 100644 --- a/target-i386/seg_helper.c +++ b/target-i386/seg_helper.c @@ -23,6 +23,7 @@ #include "qemu/log.h" #include "exec/helper-proto.h" #include "exec/cpu_ldst.h" +#include "exec/log.h" //#define DEBUG_PCALL diff --git a/target-i386/smm_helper.c b/target-i386/smm_helper.c index b930421..e7bb5be 100644 --- a/target-i386/smm_helper.c +++ b/target-i386/smm_helper.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "exec/helper-proto.h" +#include "exec/log.h" /* SMM support */ diff --git a/target-i386/translate.c b/target-i386/translate.c index 957a92d..73a45c8 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -28,6 +28,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define PREFIX_REPZ 0x01 diff --git a/target-lm32/helper.c b/target-lm32/helper.c index 3ebec68..655248f 100644 --- a/target-lm32/helper.c +++ b/target-lm32/helper.c @@ -22,6 +22,7 @@ #include "qemu/host-utils.h" #include "sysemu/sysemu.h" #include "exec/semihost.h" +#include "exec/log.h" int lm32_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int rw, int mmu_idx) diff --git a/target-lm32/translate.c b/target-lm32/translate.c index 477d428..52fe562 100644 --- a/target-lm32/translate.c +++ b/target-lm32/translate.c @@ -29,6 +29,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define DISAS_LM32 1 diff --git a/target-m68k/translate.c b/target-m68k/translate.c index 342c040..a402bd8 100644 --- a/target-m68k/translate.c +++ b/target-m68k/translate.c @@ -29,6 +29,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" //#define DEBUG_DISPATCH 1 diff --git a/target-microblaze/helper.c b/target-microblaze/helper.c index 3b0fae8..4de6bdb 100644 --- a/target-microblaze/helper.c +++ b/target-microblaze/helper.c @@ -21,6 +21,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "qemu/host-utils.h" +#include "exec/log.h" #define D(x) diff --git a/target-microblaze/translate.c b/target-microblaze/translate.c index 2e1293d..40be4ec 100644 --- a/target-microblaze/translate.c +++ b/target-microblaze/translate.c @@ -28,6 +28,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define SIM_COMPAT 0 diff --git a/target-mips/helper.c b/target-mips/helper.c index f9c4c11..1004ede 100644 --- a/target-mips/helper.c +++ b/target-mips/helper.c @@ -21,6 +21,7 @@ #include "cpu.h" #include "sysemu/kvm.h" #include "exec/cpu_ldst.h" +#include "exec/log.h" enum { TLBRET_XI = -6, diff --git a/target-mips/translate.c b/target-mips/translate.c index 383d4b5..791866b 100644 --- a/target-mips/translate.c +++ b/target-mips/translate.c @@ -33,6 +33,7 @@ #include "exec/semihost.h" #include "trace-tcg.h" +#include "exec/log.h" #define MIPS_DEBUG_DISAS 0 diff --git a/target-moxie/translate.c b/target-moxie/translate.c index 229ce3b..04ab278 100644 --- a/target-moxie/translate.c +++ b/target-moxie/translate.c @@ -31,6 +31,7 @@ #include "exec/helper-proto.h" #include "exec/helper-gen.h" +#include "exec/log.h" /* This is the state at translation time. */ typedef struct DisasContext { diff --git a/target-openrisc/translate.c b/target-openrisc/translate.c index 62890c2..b766b27 100644 --- a/target-openrisc/translate.c +++ b/target-openrisc/translate.c @@ -32,6 +32,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define OPENRISC_DISAS diff --git a/target-ppc/mmu-hash32.c b/target-ppc/mmu-hash32.c index b076d80..39abb2f 100644 --- a/target-ppc/mmu-hash32.c +++ b/target-ppc/mmu-hash32.c @@ -24,6 +24,7 @@ #include "sysemu/kvm.h" #include "kvm_ppc.h" #include "mmu-hash32.h" +#include "exec/log.h" //#define DEBUG_BAT diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c index 6d110ee..9c58fbf 100644 --- a/target-ppc/mmu-hash64.c +++ b/target-ppc/mmu-hash64.c @@ -25,6 +25,7 @@ #include "qemu/error-report.h" #include "kvm_ppc.h" #include "mmu-hash64.h" +#include "exec/log.h" //#define DEBUG_SLB diff --git a/target-ppc/mmu_helper.c b/target-ppc/mmu_helper.c index de4e286..e5ec8d6 100644 --- a/target-ppc/mmu_helper.c +++ b/target-ppc/mmu_helper.c @@ -24,6 +24,7 @@ #include "mmu-hash64.h" #include "mmu-hash32.h" #include "exec/cpu_ldst.h" +#include "exec/log.h" //#define DEBUG_MMU //#define DEBUG_BATS diff --git a/target-ppc/translate.c b/target-ppc/translate.c index 7db3145..0057bda 100644 --- a/target-ppc/translate.c +++ b/target-ppc/translate.c @@ -29,6 +29,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define CPU_SINGLE_STEP 0x1 diff --git a/target-s390x/translate.c b/target-s390x/translate.c index 811928b..3087692 100644 --- a/target-s390x/translate.c +++ b/target-s390x/translate.c @@ -44,6 +44,7 @@ static TCGv_ptr cpu_env; #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" /* Information that (most) every instruction needs to manipulate. */ diff --git a/target-sh4/helper.c b/target-sh4/helper.c index 9d8b61c..6438338 100644 --- a/target-sh4/helper.c +++ b/target-sh4/helper.c @@ -19,6 +19,7 @@ #include "qemu/osdep.h" #include "cpu.h" +#include "exec/log.h" #if !defined(CONFIG_USER_ONLY) #include "hw/sh4/sh_intc.h" diff --git a/target-sh4/translate.c b/target-sh4/translate.c index 9de5659..3e4164b 100644 --- a/target-sh4/translate.c +++ b/target-sh4/translate.c @@ -29,6 +29,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" typedef struct DisasContext { diff --git a/target-sparc/int32_helper.c b/target-sparc/int32_helper.c index d4d6a4b..09afe13 100644 --- a/target-sparc/int32_helper.c +++ b/target-sparc/int32_helper.c @@ -21,6 +21,7 @@ #include "cpu.h" #include "trace.h" #include "sysemu/sysemu.h" +#include "exec/log.h" #define DEBUG_PCALL diff --git a/target-sparc/int64_helper.c b/target-sparc/int64_helper.c index ddef66b..aa876cd 100644 --- a/target-sparc/int64_helper.c +++ b/target-sparc/int64_helper.c @@ -20,6 +20,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "exec/helper-proto.h" +#include "exec/log.h" #include "trace.h" #define DEBUG_PCALL diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 747f94d..6726860 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -29,6 +29,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" #define DEBUG_DISAS diff --git a/target-tilegx/translate.c b/target-tilegx/translate.c index 2088f87..a5bb8d4 100644 --- a/target-tilegx/translate.c +++ b/target-tilegx/translate.c @@ -21,6 +21,7 @@ #include "qemu/osdep.h" #include "cpu.h" #include "qemu/log.h" +#include "exec/log.h" #include "disas/disas.h" #include "tcg-op.h" #include "exec/cpu_ldst.h" diff --git a/target-tricore/translate.c b/target-tricore/translate.c index 2b07b86..e385fc7 100644 --- a/target-tricore/translate.c +++ b/target-tricore/translate.c @@ -28,6 +28,7 @@ #include "exec/helper-gen.h" #include "tricore-opcodes.h" +#include "exec/log.h" /* * TCG registers diff --git a/target-unicore32/translate.c b/target-unicore32/translate.c index 5db8f94..7dbfe3b 100644 --- a/target-unicore32/translate.c +++ b/target-unicore32/translate.c @@ -20,6 +20,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" /* internal defines */ diff --git a/target-xtensa/translate.c b/target-xtensa/translate.c index a8c1113..435ee03 100644 --- a/target-xtensa/translate.c +++ b/target-xtensa/translate.c @@ -43,6 +43,7 @@ #include "exec/helper-gen.h" #include "trace-tcg.h" +#include "exec/log.h" typedef struct DisasContext { diff --git a/tcg/tcg.c b/tcg/tcg.c index 3ce02dc..be765ad 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -60,6 +60,7 @@ #endif #include "elf.h" +#include "exec/log.h" /* Forward declarations for functions declared in tcg-target.c and used here. */ static void tcg_target_init(TCGContext *s); diff --git a/translate-all.c b/translate-all.c index ab61fac..e9f409b 100644 --- a/translate-all.c +++ b/translate-all.c @@ -55,6 +55,7 @@ #include "translate-all.h" #include "qemu/bitmap.h" #include "qemu/timer.h" +#include "exec/log.h" //#define DEBUG_TB_INVALIDATE //#define DEBUG_FLUSH