From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51295) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VAOnK-0004du-RY for qemu-devel@nongnu.org; Fri, 16 Aug 2013 14:30:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VAOnH-0008Me-CZ for qemu-devel@nongnu.org; Fri, 16 Aug 2013 14:30:42 -0400 Received: from mail.avalus.com ([2001:41c8:10:1dd::10]:49015) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VAOnG-0008Lq-0a for qemu-devel@nongnu.org; Fri, 16 Aug 2013 14:30:38 -0400 From: Alex Bligh Date: Fri, 16 Aug 2013 19:29:51 +0100 Message-Id: <1376677812-9448-11-git-send-email-alex@alex.org.uk> In-Reply-To: <1376677812-9448-1-git-send-email-alex@alex.org.uk> References: <1376677812-9448-1-git-send-email-alex@alex.org.uk> Subject: [Qemu-devel] [PATCHv12 10/31] aio / timers: Add QEMUTimerListGroup and helper functions List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Alex Bligh , Jan Kiszka , liu ping fan , Stefan Hajnoczi , Paolo Bonzini , MORITA Kazutaka , rth@twiddle.net 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 --- include/qemu/timer.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++ include/qemu/typedefs.h | 1 + qemu-timer.c | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) diff --git a/include/qemu/timer.h b/include/qemu/timer.h index ef24ef9..38b7021 100644 --- a/include/qemu/timer.h +++ b/include/qemu/timer.h @@ -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 { @@ -64,6 +69,7 @@ struct QEMUTimer { int scale; }; +extern QEMUTimerListGroup main_loop_tlg; extern QEMUClock *qemu_clocks[QEMU_CLOCK_MAX]; /** @@ -218,6 +224,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 * diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h index cae94ff..3205540 100644 --- a/include/qemu/typedefs.h +++ b/include/qemu/typedefs.h @@ -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; diff --git a/qemu-timer.c b/qemu-timer.c index 2a83928..2f346c9 100644 --- a/qemu-timer.c +++ b/qemu-timer.c @@ -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 @@ -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; @@ -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; } } -- 1.7.9.5