Skip to content

Commit

Permalink
aio / timers: Add QEMUTimerListGroup and helper functions
Browse files Browse the repository at this point in the history
Add QEMUTimerListGroup and helper functions, to represent
a QEMUTimerList associated with each clock. Add a default
QEMUTimerListGroup representing the default timer lists
which are not associated with any other object (e.g.
an AioContext as added by future patches).

Signed-off-by: Alex Bligh <alex@alex.org.uk>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
abligh authored and stefanhaRH committed Aug 22, 2013
1 parent 6a1751b commit 754d6a5
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 0 deletions.
49 changes: 49 additions & 0 deletions include/qemu/timer.h
Expand Up @@ -53,6 +53,11 @@ typedef enum {

typedef struct QEMUClock QEMUClock;
typedef struct QEMUTimerList QEMUTimerList;

struct QEMUTimerListGroup {
QEMUTimerList *tl[QEMU_CLOCK_MAX];
};

typedef void QEMUTimerCB(void *opaque);

struct QEMUTimer {
Expand All @@ -64,6 +69,7 @@ struct QEMUTimer {
int scale;
};

extern QEMUTimerListGroup main_loop_tlg;
extern QEMUClock *qemu_clocks[QEMU_CLOCK_MAX];

/**
Expand Down Expand Up @@ -217,6 +223,49 @@ QEMUClock *timerlist_get_clock(QEMUTimerList *timer_list);
*/
bool timerlist_run_timers(QEMUTimerList *timer_list);

/**
* timerlistgroup_init:
* @tlg: the timer list group
*
* Initialise a timer list group. This must already be
* allocated in memory and zeroed.
*/
void timerlistgroup_init(QEMUTimerListGroup *tlg);

/**
* timerlistgroup_deinit:
* @tlg: the timer list group
*
* Deinitialise a timer list group. This must already be
* initialised. Note the memory is not freed.
*/
void timerlistgroup_deinit(QEMUTimerListGroup *tlg);

/**
* timerlistgroup_run_timers:
* @tlg: the timer list group
*
* Run the timers associated with a timer list group.
* This will run timers on multiple clocks.
*
* Returns: true if any timer callback ran
*/
bool timerlistgroup_run_timers(QEMUTimerListGroup *tlg);

/**
* timerlistgroup_deadline_ns
* @tlg: the timer list group
*
* Determine the deadline of the soonest timer to
* expire associated with any timer list linked to
* the timer list group. Only clocks suitable for
* deadline calculation are included.
*
* Returns: the deadline in nanoseconds or -1 if no
* timers are to expire.
*/
int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg);

/**
* qemu_timeout_ns_to_ms:
* @ns: nanosecond timeout value
Expand Down
1 change: 1 addition & 0 deletions include/qemu/typedefs.h
Expand Up @@ -4,6 +4,7 @@
/* A load of opaque types so that device init declarations don't have to
pull in all the real definitions. */
typedef struct QEMUTimer QEMUTimer;
typedef struct QEMUTimerListGroup QEMUTimerListGroup;
typedef struct QEMUFile QEMUFile;
typedef struct QEMUBH QEMUBH;

Expand Down
42 changes: 42 additions & 0 deletions qemu-timer.c
Expand Up @@ -59,6 +59,7 @@ struct QEMUClock {
bool enabled;
};

QEMUTimerListGroup main_loop_tlg;
QEMUClock *qemu_clocks[QEMU_CLOCK_MAX];

/* A QEMUTimerList is a list of timers attached to a clock. More
Expand Down Expand Up @@ -564,6 +565,46 @@ bool qemu_run_timers(QEMUClock *clock)
return timerlist_run_timers(clock->main_loop_timerlist);
}

void timerlistgroup_init(QEMUTimerListGroup *tlg)
{
QEMUClockType type;
for (type = 0; type < QEMU_CLOCK_MAX; type++) {
tlg->tl[type] = timerlist_new(type);
}
}

void timerlistgroup_deinit(QEMUTimerListGroup *tlg)
{
QEMUClockType type;
for (type = 0; type < QEMU_CLOCK_MAX; type++) {
timerlist_free(tlg->tl[type]);
}
}

bool timerlistgroup_run_timers(QEMUTimerListGroup *tlg)
{
QEMUClockType type;
bool progress = false;
for (type = 0; type < QEMU_CLOCK_MAX; type++) {
progress |= timerlist_run_timers(tlg->tl[type]);
}
return progress;
}

int64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg)
{
int64_t deadline = -1;
QEMUClockType type;
for (type = 0; type < QEMU_CLOCK_MAX; type++) {
if (qemu_clock_use_for_deadline(tlg->tl[type]->clock)) {
deadline = qemu_soonest_timeout(deadline,
timerlist_deadline_ns(
tlg->tl[type]));
}
}
return deadline;
}

int64_t qemu_get_clock_ns(QEMUClock *clock)
{
int64_t now, last;
Expand Down Expand Up @@ -605,6 +646,7 @@ void init_clocks(void)
for (type = 0; type < QEMU_CLOCK_MAX; type++) {
if (!qemu_clocks[type]) {
qemu_clocks[type] = qemu_clock_new(type);
main_loop_tlg.tl[type] = qemu_clocks[type]->main_loop_timerlist;
}
}

Expand Down

0 comments on commit 754d6a5

Please sign in to comment.