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



Reply via email to