On 02/06/2012 02:14 PM, Andreas Färber wrote:
Am 06.02.2012 20:24, schrieb Anthony Liguori:
On 02/02/2012 08:59 PM, Andreas Färber wrote:
+/**
+ * cpu_common_reset:
+ * @cpu: The CPU whose common state is to be reset.
+ *
+ * To be used by derived classes.
+ */
+void cpu_common_reset(CPU *cpu);
Make this static, initialize reset = cpu_common_reset in
cpu_class_initfn, then in the derived class initfn, save the pointer to
the parent reset function so it can be called later.
I don't see how that would work. To initialize, e.g., the ARMCPUClass
with additional class fields I'm overriding the .class_init.
You're not overriding the class_init. The class init for a type is called when
that class is initialized for the first time. See the documentation in object.h.
When class_init is called, the parent class type's class_init has already been
called and the default values are set. So:
static void arm_cpu_reset(CPUCommon *cpu)
{
ARMCPU *s = ARM_CPU(cpu);
ARMCPUClass *ac = ARM_CPU_GET_CLASS(s);
// do arm specific reset
// call super class reset
ac->super_reset(cpu);
}
static void arm_cpu_class_initfn(ObjectClass *klass, void *data)
{
CPUCommonClass *cc = CPU_COMMON_CLASS(klass);
ARMCPUClass *ac = ARM_CPU_CLASS(klass);
// cc->reset was set in CPUCommonClass's class_init
ac->super_reset = cc->reset;
cc->reset = arm_cpu_reset;
}
It's admittedly a little funky but this is the common idiom in gobject. I'm not
sure there's a better way.
Regards,
Anthony Liguori
So in order
to let CPUClass initialize the reset callback to its static one I'd need
to make CPU's class_init function non-static so that I can call that
from my derived class' class_init function, no?
Andreas