[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGr
From: |
Alex Bligh |
Subject: |
Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions |
Date: |
Fri, 9 Aug 2013 15:27:46 +0100 |
Paolo,
>> diff --git a/include/qemu/timer.h b/include/qemu/timer.h
>> index 1baa0e2..3b46f60 100644
>> --- a/include/qemu/timer.h
>> +++ b/include/qemu/timer.h
>> @@ -52,8 +52,10 @@ typedef enum {
>>
>> typedef struct QEMUClock QEMUClock;
>> typedef struct QEMUTimerList QEMUTimerList;
>> +typedef QEMUTimerList *QEMUTimerListGroup[QEMU_CLOCK_MAX];
>
> Please wrap this in a struct for easier future extensibility.
OK
> I'm not a big fan of the TimerListGroup name, but I cannot think of
> anything better...
Ditto
> ... except if we get rid of TimerListGroup completely and put it in
> AioContext. To do so, we can have _two_ AioContexts in main-loop.c.
> One is for the block layer, the other is only used for timers. Later we
> could move bottom halves from the first to the second, too.
I don't really want to do this, or at least I don't want to do it yet.
Partly my concern is about initialising a dummy AioContext and having
it hang around. Partly the point is that the timer stuff is meant to
work without any AioContexts. But mostly I think Stefan is already
looking at reworking the thing into a single event loop so this
problem will go away of its own accord.
Apart from the fact I will have just wrapped it in a struct ( :-) ),
the entire change required then will be:
1. delete main_loop_ltg
2. rewrite the wrappers to use a default AioContext
3. delete the typedef and put the raw array into the AioContext
struct (having deleted main_loop_tlg as unused.
This is all pretty trivial and I think best done after Stefan's
work than before.
Alex
> Sorry for not thinking of this before.
>
> Paolo
>
>> typedef void QEMUTimerCB(void *opaque);
>>
>> +extern QEMUTimerListGroup main_loop_tlg;
>> extern QEMUClock *qemu_clocks[QEMU_CLOCK_MAX];
>>
>> /**
>> @@ -211,6 +213,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/qemu-timer.c b/qemu-timer.c
>> index 1a0a4b1..e151d24 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
>> @@ -575,6 +576,45 @@ 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[type] = timerlist_new(type);
>> + }
>> +}
>> +
>> +void timerlistgroup_deinit(QEMUTimerListGroup tlg)
>> +{
>> + QEMUClockType type;
>> + for (type = 0; type < QEMU_CLOCK_MAX; type++) {
>> + timerlist_free(tlg[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[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[type]->clock)) {
>> + deadline = qemu_soonest_timeout(deadline,
>> +
>> timerlist_deadline_ns(tlg[type]));
>> + }
>> + }
>> + return deadline;
>> +}
>> +
>> int64_t qemu_get_clock_ns(QEMUClock *clock)
>> {
>> int64_t now, last;
>> @@ -616,6 +656,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[type] = qemu_clocks[type]->main_loop_timerlist;
>> }
>> }
>>
>>
>
>
--
Alex Bligh
- [Qemu-devel] [RFC] [PATCHv8 00/30] aio / timers: Add AioContext timers and use ppoll, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 03/30] aio / timers: Consistent treatment of disabled clocks for deadlines, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 04/30] aio / timers: add ppoll support with qemu_poll_ns, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 05/30] aio / timers: Add prctl(PR_SET_TIMERSLACK, 1, ...) to reduce timer slack, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 01/30] aio / timers: Rename qemu_new_clock and expose clock types, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 06/30] aio / timers: Make qemu_run_timers and qemu_run_all_timers return progress, Alex Bligh, 2013/08/08
- [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/08
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Paolo Bonzini, 2013/08/09
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions,
Alex Bligh <=
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Paolo Bonzini, 2013/08/09
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/09
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Paolo Bonzini, 2013/08/09
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/10
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Paolo Bonzini, 2013/08/11
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/11
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Paolo Bonzini, 2013/08/12
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/12
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Wenchao Xia, 2013/08/12
- Re: [Qemu-devel] [RFC] [PATCHv8 09/30] aio / timers: Add QEMUTimerListGroup and helper functions, Alex Bligh, 2013/08/12