mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
clock: Add ClockEvent parameter to callbacks
The Clock framework allows users to specify a callback which is called after the clock's period has been updated. Some users need to also have a callback which is called before the clock period is updated. As the first step in adding support for notifying Clock users on pre-update events, add an argument to the ClockCallback to specify what event is being notified, and add an argument to the various functions for registering a callback to specify which events are of interest to that callback. Note that the documentation update renders correct the previously incorrect claim in 'Adding a new clock' that callbacks "will be explained in a following section". Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Luc Michel <luc@lmichel.fr> Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20210219144617.4782-2-peter.maydell@linaro.org
This commit is contained in:
parent
0436c55edf
commit
5ee0abed51
20 changed files with 161 additions and 58 deletions
|
@ -39,15 +39,17 @@ Clock *clock_new(Object *parent, const char *name)
|
|||
return clk;
|
||||
}
|
||||
|
||||
void clock_set_callback(Clock *clk, ClockCallback *cb, void *opaque)
|
||||
void clock_set_callback(Clock *clk, ClockCallback *cb, void *opaque,
|
||||
unsigned int events)
|
||||
{
|
||||
clk->callback = cb;
|
||||
clk->callback_opaque = opaque;
|
||||
clk->callback_events = events;
|
||||
}
|
||||
|
||||
void clock_clear_callback(Clock *clk)
|
||||
{
|
||||
clock_set_callback(clk, NULL, NULL);
|
||||
clock_set_callback(clk, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
bool clock_set(Clock *clk, uint64_t period)
|
||||
|
@ -62,6 +64,17 @@ bool clock_set(Clock *clk, uint64_t period)
|
|||
return true;
|
||||
}
|
||||
|
||||
static void clock_call_callback(Clock *clk, ClockEvent event)
|
||||
{
|
||||
/*
|
||||
* Call the Clock's callback for this event, if it has one and
|
||||
* is interested in this event.
|
||||
*/
|
||||
if (clk->callback && (clk->callback_events & event)) {
|
||||
clk->callback(clk->callback_opaque, event);
|
||||
}
|
||||
}
|
||||
|
||||
static void clock_propagate_period(Clock *clk, bool call_callbacks)
|
||||
{
|
||||
Clock *child;
|
||||
|
@ -72,8 +85,8 @@ static void clock_propagate_period(Clock *clk, bool call_callbacks)
|
|||
trace_clock_update(CLOCK_PATH(child), CLOCK_PATH(clk),
|
||||
CLOCK_PERIOD_TO_HZ(clk->period),
|
||||
call_callbacks);
|
||||
if (call_callbacks && child->callback) {
|
||||
child->callback(child->callback_opaque);
|
||||
if (call_callbacks) {
|
||||
clock_call_callback(child, ClockUpdate);
|
||||
}
|
||||
clock_propagate_period(child, call_callbacks);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue