|
|
|
@ -44,16 +44,12 @@ Clock *clock_new(Object *parent, const char *name) |
|
|
|
void clock_set_callback(Clock *clk, ClockCallback *cb, void *opaque, |
|
|
|
unsigned int events) |
|
|
|
{ |
|
|
|
assert(OBJECT(clk)->parent); |
|
|
|
clk->callback = cb; |
|
|
|
clk->callback_opaque = opaque; |
|
|
|
clk->callback_events = events; |
|
|
|
} |
|
|
|
|
|
|
|
void clock_clear_callback(Clock *clk) |
|
|
|
{ |
|
|
|
clock_set_callback(clk, NULL, NULL, 0); |
|
|
|
} |
|
|
|
|
|
|
|
bool clock_set(Clock *clk, uint64_t period) |
|
|
|
{ |
|
|
|
if (clk->period == period) { |
|
|
|
@ -168,6 +164,16 @@ static void clock_period_prop_get(Object *obj, Visitor *v, const char *name, |
|
|
|
visit_type_uint64(v, name, &period, errp); |
|
|
|
} |
|
|
|
|
|
|
|
static void clock_unparent(Object *obj) |
|
|
|
{ |
|
|
|
/*
|
|
|
|
* Callback are registered by the parent, which might die anytime after |
|
|
|
* it's unparented the children. Avoid having a callback to a deleted |
|
|
|
* object in case the clock is still referenced somewhere else (eg: by |
|
|
|
* a clock output). |
|
|
|
*/ |
|
|
|
clock_set_callback(CLOCK(obj), NULL, NULL, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static void clock_initfn(Object *obj) |
|
|
|
{ |
|
|
|
@ -200,11 +206,17 @@ static void clock_finalizefn(Object *obj) |
|
|
|
g_free(clk->canonical_path); |
|
|
|
} |
|
|
|
|
|
|
|
static void clock_class_init(ObjectClass *klass, void *data) |
|
|
|
{ |
|
|
|
klass->unparent = clock_unparent; |
|
|
|
} |
|
|
|
|
|
|
|
static const TypeInfo clock_info = { |
|
|
|
.name = TYPE_CLOCK, |
|
|
|
.parent = TYPE_OBJECT, |
|
|
|
.instance_size = sizeof(Clock), |
|
|
|
.instance_init = clock_initfn, |
|
|
|
.class_init = clock_class_init, |
|
|
|
.instance_finalize = clock_finalizefn, |
|
|
|
}; |
|
|
|
|
|
|
|
|