Message ID | 20161005130657.3399-9-rkrcmar@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, 5 Oct 2016 15:06:57 +0200 Radim Krčmář <rkrcmar@redhat.com> wrote: > Assume that KVM would have returned the same on subsequent runs. > Abstract the memoizaiton pattern into macros and call it memorize as > adding the r makes it less obscure. > > Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > v4: > * changed the name to memorize [Igor] > * remove useless underscores in macro arguments > * merge the two macros, as it seems that the deleted one wouldn't get > other users anytime soon > --- > target-i386/kvm.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/target-i386/kvm.c b/target-i386/kvm.c > index 0fd664648665..0472f45fd092 100644 > --- a/target-i386/kvm.c > +++ b/target-i386/kvm.c > @@ -129,10 +129,23 @@ static bool kvm_x2apic_api_set_flags(uint64_t flags) > return !kvm_vm_enable_cap(s, KVM_CAP_X2APIC_API, 0, flags); > } > > +#define MEMORIZE(fn) \ > + ({ \ > + static typeof(fn) _result; \ > + static bool _memorized; \ > + \ > + if (_memorized) { \ > + return _result; \ > + } \ > + _memorized = true; \ > + _result = fn; \ > + }) > + > bool kvm_enable_x2apic(void) > { > - return kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS | > - KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK); > + return MEMORIZE( > + kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS | > + KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK)); > } > > static int kvm_get_tsc(CPUState *cs)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 0fd664648665..0472f45fd092 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -129,10 +129,23 @@ static bool kvm_x2apic_api_set_flags(uint64_t flags) return !kvm_vm_enable_cap(s, KVM_CAP_X2APIC_API, 0, flags); } +#define MEMORIZE(fn) \ + ({ \ + static typeof(fn) _result; \ + static bool _memorized; \ + \ + if (_memorized) { \ + return _result; \ + } \ + _memorized = true; \ + _result = fn; \ + }) + bool kvm_enable_x2apic(void) { - return kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS | - KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK); + return MEMORIZE( + kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS | + KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK)); } static int kvm_get_tsc(CPUState *cs)
Assume that KVM would have returned the same on subsequent runs. Abstract the memoizaiton pattern into macros and call it memorize as adding the r makes it less obscure. Signed-off-by: Radim Krčmář <rkrcmar@redhat.com> --- v4: * changed the name to memorize [Igor] * remove useless underscores in macro arguments * merge the two macros, as it seems that the deleted one wouldn't get other users anytime soon --- target-i386/kvm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)