18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef QEMU_TIMER_H
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define QEMU_TIMER_H
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner#include "qemu/typedefs.h"
56a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#include "qemu-common.h"
6dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner#include "qemu/notify.h"
76a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* timers */
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_MS 1000000
11317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_US 1000
12317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#define SCALE_NS 1
13317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
14dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
15dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUClockType:
16dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
17dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The following clock types are available:
18dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
19dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_REALTIME: Real time clock
20dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
21dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The real time clock should be used only for stuff which does not
22dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * change the virtual machine state, as it is run even if the virtual
23dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * machine is stopped. The real time clock has a frequency of 1000
24dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Hz.
25dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
26dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_VIRTUAL: virtual clock
27dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
28dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The virtual clock is only run during the emulation. It is stopped
29dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * when the virtual machine is stopped. Virtual timers use a high
30dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * precision clock, usually cpu cycles (use ticks_per_sec).
31dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
32dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @QEMU_CLOCK_HOST: host clock
33dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
34dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The host clock should be use for device models that emulate accurate
35dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * real time sources. It will continue to run when the virtual machine
36dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is suspended, and it will reflect system time changes the host may
37dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * undergo (e.g. due to NTP). The host clock has the same precision as
38dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the virtual clock.
39dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
40dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
41dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef enum {
42dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMU_CLOCK_REALTIME = 0,
43dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMU_CLOCK_VIRTUAL = 1,
44dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMU_CLOCK_HOST = 2,
45dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMU_CLOCK_MAX
46dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner} QEMUClockType;
47dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
48dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef struct QEMUTimerList QEMUTimerList;
49dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
50dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstruct QEMUTimerListGroup {
51dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMUTimerList *tl[QEMU_CLOCK_MAX];
52dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner};
53dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void QEMUTimerCB(void *opaque);
55dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnertypedef void QEMUTimerListNotifyCB(void *opaque);
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
57dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstruct QEMUTimer {
58dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    int64_t expire_time;        /* in nanoseconds */
59dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMUTimerList *timer_list;
60dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMUTimerCB *cb;
61dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    void *opaque;
62dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMUTimer *next;
63dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    int scale;
64dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner};
65dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
66dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerextern QEMUTimerListGroup main_loop_tlg;
67dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
68dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
69dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUClockType
70dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
72dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
73dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_ns;
74dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
75dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
76dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the nanosecond value of a clock with
77dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type
78dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
79dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in nanoseconds
80dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
81dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t qemu_clock_get_ns(QEMUClockType type);
82dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
83dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
84dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_ms;
85dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
86dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
87dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the millisecond value of a clock with
88dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type
89dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
90dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in milliseconds
91dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
92dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_clock_get_ms(QEMUClockType type)
93317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
94dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return qemu_clock_get_ns(type) / SCALE_MS;
95317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
96317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
97dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
98dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_us;
99dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
100dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
101dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Get the microsecond value of a clock with
102dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type
103dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
104dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock value in microseconds
105dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
106dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_clock_get_us(QEMUClockType type)
107317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
108dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return qemu_clock_get_ns(type) / SCALE_US;
109317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
110317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
111dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
112dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_has_timers:
113dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
114dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
115dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a clock's default timer list
116dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has timers attached
117dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
118dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Note that this function should not be used when other threads also access
119dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list.  The return value may be outdated by the time it is acted
120dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * upon.
121dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
122dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock's default timer list
123dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has timers attached
124dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
125dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_has_timers(QEMUClockType type);
126dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
127dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
128dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_expired:
129dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
130dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
131dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a clock's default timer list
132dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * has an expired clock.
133dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
134dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock's default timer list has
135dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * an expired timer
136dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
137dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_expired(QEMUClockType type);
138dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
139dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
140dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_use_for_deadline:
141dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
142dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
143dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a clock should be used for deadline
144dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * calculations. Some clocks, for instance vm_clock with
145dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * use_icount set, do not count in nanoseconds. Such clocks
146dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are not used for deadline calculations, and are presumed
147dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * to interrupt any poll using qemu_notify/aio_notify
148dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * etc.
149dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
150dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the clock runs in nanoseconds and
151dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * should be used for a deadline.
152dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
153dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_use_for_deadline(QEMUClockType type);
154dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
155dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
156dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_deadline_ns_all:
157dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
158dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
159dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Calculate the deadline across all timer lists associated
160dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * with a clock (as opposed to just the default one)
161dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * in nanoseconds, or -1 if no timer is set to expire.
162dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
163dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: time until expiry in nanoseconds or -1
164dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
165dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t qemu_clock_deadline_ns_all(QEMUClockType type);
166dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
167dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
168dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_get_main_loop_timerlist:
169dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
170dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
171dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Return the default timer list assocatiated with a clock.
172dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
173dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the default timer list
174dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
175dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUTimerList *qemu_clock_get_main_loop_timerlist(QEMUClockType type);
176dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
177dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
178dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_nofify:
179dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
180dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
181dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Call the notifier callback connected with the default timer
182dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * list linked to the clock, or qemu_notify() if none.
183dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
184dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_notify(QEMUClockType type);
185dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
186dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
187dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_enable:
188dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
189dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @enabled: true to enable, false to disable
190dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
191dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Enable or disable a clock
192dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Disabling the clock will wait for related timerlists to stop
193dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * executing qemu_run_timers.  Thus, this functions should not
194dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * be used from the callback of a timer that is based on @clock.
195dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Doing so would cause a deadlock.
196dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
197dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Caller should hold BQL.
198dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
199dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_enable(QEMUClockType type, bool enabled);
200dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
201dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
202dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_warp:
203dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
204dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
205dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Warp a clock to a new value
206dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
207dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_warp(QEMUClockType type);
208dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
209dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
210dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_register_reset_notifier:
211dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
212dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @notifier: the notifier function
213dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
214dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Register a notifier function to call when the clock
215dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * concerned is reset.
216dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
217dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_register_reset_notifier(QEMUClockType type,
218dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                        Notifier *notifier);
219dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
220dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
221dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_unregister_reset_notifier:
222dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type
223dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @notifier: the notifier function
224dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
225dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Unregister a notifier function to call when the clock
226dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * concerned is reset.
227dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
228dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid qemu_clock_unregister_reset_notifier(QEMUClockType type,
229dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                          Notifier *notifier);
230dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
231dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
232dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_run_timers:
233dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: clock on which to operate
234dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
235dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run all the timers associated with the default timer list
236dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * of a clock.
237dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
238dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer ran.
239dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
240dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_run_timers(QEMUClockType type);
241dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
242dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
243dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_clock_run_all_timers:
244dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
245dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run all the timers associated with the default timer list
246dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * of every clock.
247dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
248dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer ran.
249dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
250dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool qemu_clock_run_all_timers(void);
251dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
252dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
253dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimerList
254dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
255dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
256dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
257dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_new:
258dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type to associate with the timerlist
259dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to call on notification
260dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback
261dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
262dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timerlist associated with the clock of
263dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * type @type.
264dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
265dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the QEMUTimerList created
266dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
267dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUTimerList *timerlist_new(QEMUClockType type,
268dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                             QEMUTimerListNotifyCB *cb, void *opaque);
269dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
270dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
271dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_free:
272dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to free
273dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
274dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Frees a timer_list. It must have no active timers.
275dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
276dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlist_free(QEMUTimerList *timer_list);
277dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
278dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
279dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_has_timers:
280dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on
281dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
282dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a timer list has active timers
283dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
284dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Note that this function should not be used when other threads also access
285dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list.  The return value may be outdated by the time it is acted
286dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * upon.
287dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
288dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer list has timers.
289dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
290dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_has_timers(QEMUTimerList *timer_list);
291dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
292dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
293dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_expired:
294dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on
295dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
296dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine whether a timer list has any timers which
297dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are expired.
298dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
299dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer list has timers which
300dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * have expired.
301dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
302dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_expired(QEMUTimerList *timer_list);
303dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
304dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
305dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_deadline_ns:
306dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on
307dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
308dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the deadline for a timer_list, i.e.
309dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the number of nanoseconds until the first timer
310dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * expires. Return -1 if there are no timers.
311dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
312dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the number of nanoseconds until the earliest
313dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer expires -1 if none
314dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
315dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t timerlist_deadline_ns(QEMUTimerList *timer_list);
316dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
317dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
318dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_get_clock:
319dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to operate on
320dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
321dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the clock type associated with a timer list.
322dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
323dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the clock type associated with the
324dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer list.
325dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
326dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' TurnerQEMUClockType timerlist_get_clock(QEMUTimerList *timer_list);
327dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
328dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
329dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_run_timers:
330dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to use
331dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
332dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Call all expired timers associated with the timer list.
333dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
334dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer expired
335dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
336dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlist_run_timers(QEMUTimerList *timer_list);
337dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
338dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
339dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlist_notify:
340dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to use
341dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
342dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * call the notifier callback associated with the timer list.
343dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
344dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlist_notify(QEMUTimerList *timer_list);
345dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
346dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
347dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimerListGroup
348dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
349dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
350dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
351dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_init:
352dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group
353dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to call when a notify is required
354dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback.
355dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
356dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise a timer list group. This must already be
357dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * allocated in memory and zeroed. The notifier callback is
358dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * called whenever a clock in the timer list group is
359dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * reenabled or whenever a timer associated with any timer
360dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * list is modified. If @cb is specified as null, qemu_notify()
361dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is used instead.
362dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
363dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlistgroup_init(QEMUTimerListGroup *tlg,
364dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                         QEMUTimerListNotifyCB *cb, void *opaque);
365dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
366dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
367dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_deinit:
368dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group
369dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
370dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Deinitialise a timer list group. This must already be
371dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * initialised. Note the memory is not freed.
372dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
373dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timerlistgroup_deinit(QEMUTimerListGroup *tlg);
374dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
375dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
376dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_run_timers:
377dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group
378dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
379dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Run the timers associated with a timer list group.
380dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This will run timers on multiple clocks.
381dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
382dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if any timer callback ran
383dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
384dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timerlistgroup_run_timers(QEMUTimerListGroup *tlg);
385dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
386dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
387dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timerlistgroup_deadline_ns:
388dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @tlg: the timer list group
389dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
390dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the deadline of the soonest timer to
391dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * expire associated with any timer list linked to
392dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * the timer list group. Only clocks suitable for
393dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * deadline calculation are included.
394dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
395dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the deadline in nanoseconds or -1 if no
396dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timers are to expire.
397dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
398dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t timerlistgroup_deadline_ns(QEMUTimerListGroup *tlg);
399dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
400dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
401dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * QEMUTimer
402dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
403dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
404dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
405dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_init:
406dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer to be initialised
407dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to attach the timer to
408dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr
409dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires
410dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback
411dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
412dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise a new timer and associate it with @timer_list.
413dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The caller is responsible for allocating the memory.
414dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
415dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * You need not call an explicit deinit call. Simply make
416dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * sure it is not on a list with timer_del.
417dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
418dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_init(QEMUTimer *ts,
419dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                QEMUTimerList *timer_list, int scale,
420dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                QEMUTimerCB *cb, void *opaque);
421dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
422dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
423dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_tl:
424dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timer_list: the timer list to attach the timer to
425dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr
426dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires
427dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback
428dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
429dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Creeate a new timer and associate it with @timer_list.
430dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * The memory is allocated by the function.
431dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
432dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This is not the preferred interface unless you know you
433dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * are going to call timer_free. Use timer_init instead.
434dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
435dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the timer
436dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
437dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_tl(QEMUTimerList *timer_list,
438dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      int scale,
439dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      QEMUTimerCB *cb,
440dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      void *opaque)
441dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{
442dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    QEMUTimer *ts = g_malloc0(sizeof(QEMUTimer));
443dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    timer_init(ts, timer_list, scale, cb, opaque);
444dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return ts;
445dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}
446dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
447dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
448dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new:
449dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @type: the clock type to use
450dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @scale: the scale value for the tiemr
451dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @cb: the callback to be called when the timer expires
452dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to be passed to the callback
453dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
454dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Creeate a new timer and associate it with the default
455dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer list for the clock type @type.
456dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
457dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the timer
458dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
459dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new(QEMUClockType type, int scale,
460dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                   QEMUTimerCB *cb, void *opaque)
461dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{
462dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return timer_new_tl(main_loop_tlg.tl[type], scale, cb, opaque);
463dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}
464dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
465dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
466dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_ns:
467dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer
468dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires
469dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback
470dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
471dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with nanosecond scale on the default timer list
472dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock.
473dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
474dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer
475dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
476dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_ns(QEMUClockType type, QEMUTimerCB *cb,
477dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      void *opaque)
478dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{
479dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return timer_new(type, SCALE_NS, cb, opaque);
480dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}
481dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
482dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
483dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_us:
484dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer
485dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires
486dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback
487dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
488dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with microsecond scale on the default timer list
489dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock.
490dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
491dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer
492dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
493dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_us(QEMUClockType type, QEMUTimerCB *cb,
494dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      void *opaque)
495dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{
496dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return timer_new(type, SCALE_US, cb, opaque);
497dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}
498dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
499dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
500dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_new_ms:
501dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @clock: the clock to associate with the timer
502dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @callback: the callback to call when the timer expires
503dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @opaque: the opaque pointer to pass to the callback
504dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
505dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Create a new timer with millisecond scale on the default timer list
506dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * associated with the clock.
507dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
508dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: a pointer to the newly created timer
509dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
510dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline QEMUTimer *timer_new_ms(QEMUClockType type, QEMUTimerCB *cb,
511dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner                                      void *opaque)
512dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner{
513dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return timer_new(type, SCALE_MS, cb, opaque);
514dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner}
515dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
516dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
517dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_free:
518dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
519dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
520dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Free a timer (it must not be on the active list)
521dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
522dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_free(QEMUTimer *ts);
523dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
524dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
525dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_del:
526dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
527dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
528dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Delete a timer from the active list.
529dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
530dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be
531dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running.
532dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
533dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_del(QEMUTimer *ts);
534dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
535dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
536dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_ns:
537dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
538dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds
539dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
540dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time
541dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
542dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be
543dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running.
544dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
545dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_ns(QEMUTimer *ts, int64_t expire_time);
546dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
547dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
548dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_anticipate_ns:
549dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
550dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds
551dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
552dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time or the current time,
553dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * whichever comes earlier.
554dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
555dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be
556dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running.
557dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
558dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_anticipate_ns(QEMUTimer *ts, int64_t expire_time);
559dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
560dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
561dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod:
562dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
563dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expire time in the units associated with the timer
564dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
565dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expiry at @expire_time, taking into
566dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * account the scale associated with the timer.
567dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
568dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be
569dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running.
570dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
571dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod(QEMUTimer *ts, int64_t expire_timer);
572dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
573dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
574dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_mod_anticipate:
575dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
576dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @expire_time: the expiry time in nanoseconds
577dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
578dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Modify a timer to expire at @expire_time or the current time, whichever
579dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * comes earlier, taking into account the scale associated with the timer.
580dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
581dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * This function is thread-safe but the timer and its timer list must not be
582dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * freed while this function is running.
583dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
584dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_mod_anticipate(QEMUTimer *ts, int64_t expire_time);
585dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
586dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
587dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_pending:
588dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
589dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
590dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a timer is pending (i.e. is on the
591dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * active list of timers, whether or not it has not yet expired).
592dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
593dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer is pending
594dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
595dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timer_pending(QEMUTimer *ts);
596dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
597dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
598dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_expired:
599dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
600dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
601dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determines whether a timer has expired.
602dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
603dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: true if the timer has expired
604dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
605dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerbool timer_expired(QEMUTimer *timer_head, int64_t current_time);
606dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
607dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
608dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_expire_time_ns:
609dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
610dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
611dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Determine the expiry time of a timer
612dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
613dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: the expiry time in nanoseconds
614dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
615dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turneruint64_t timer_expire_time_ns(QEMUTimer *ts);
616dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
617dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
618dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_get:
619dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @f: the file
620dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
621dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
622dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Read a timer @ts from a file @f
623dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
624dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_get(QEMUFile *f, QEMUTimer *ts);
625dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
626dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
627dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * timer_put:
628dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @f: the file
629dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ts: the timer
630dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
631dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid timer_put(QEMUFile *f, QEMUTimer *ts);
632dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
633dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/*
634dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * General utility functions
635dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
636dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
637dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
638dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_timeout_ns_to_ms:
639dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @ns: nanosecond timeout value
640dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
641dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Convert a nanosecond timeout value (or -1) to
642dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * a millisecond value (or -1), always rounding up.
643dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
644dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: millisecond timeout value
645dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
646dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint qemu_timeout_ns_to_ms(int64_t ns);
647dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
648dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
649dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_poll_ns:
650dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @fds: Array of file descriptors
651dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @nfds: number of file descriptors
652dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout: timeout in nanoseconds
653dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
654dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Perform a poll like g_poll but with a timeout in nanoseconds.
655dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * See g_poll documentation for further details.
656dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
657dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: number of fds ready
658dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
659dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint qemu_poll_ns(GPollFD *fds, guint nfds, int64_t timeout);
660dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
661dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
662dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * qemu_soonest_timeout:
663dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout1: first timeout in nanoseconds (or -1 for infinite)
664dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * @timeout2: second timeout in nanoseconds (or -1 for infinite)
665dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
666dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Calculates the soonest of two timeout values. -1 means infinite, which
667dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * is later than any other value.
668dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
669dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Returns: soonest timeout value in nanoseconds (or -1 for infinite)
670dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
671dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerstatic inline int64_t qemu_soonest_timeout(int64_t timeout1, int64_t timeout2)
672317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
673dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    /* we can abuse the fact that -1 (which means infinite) is a maximal
674dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner     * value when cast to unsigned. As this is disgusting, it's kept in
675dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner     * one inline function.
676dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner     */
677dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner    return ((uint64_t) timeout1 < (uint64_t) timeout2) ? timeout1 : timeout2;
678317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
679317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
680dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/**
681dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * initclocks:
682dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner *
683dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner * Initialise the clock & timer infrastructure
684dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner */
685dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid init_clocks(void);
686dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
687dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnerint64_t cpu_get_ticks(void);
688dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* Caller must hold BQL */
689dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid cpu_enable_ticks(void);
690dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner/* Caller must hold BQL */
691dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turnervoid cpu_disable_ticks(void);
692dcda949f769a11b197f4784fe299a448d87e6e14David 'Digit' Turner
693a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turnerstatic inline int64_t get_ticks_per_sec(void)
694a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner{
695a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner    return 1000000000LL;
696a7fb77d6eca56e61e94f62e7deb4120b60b1e919David 'Digit' Turner}
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
698f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner/*
699f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner * Low level clock functions
700f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner */
701f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner
702317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner/* real time host monotonic timer */
703317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock_realtime(void)
704317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
705317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    struct timeval tv;
706317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
707317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    gettimeofday(&tv, NULL);
708317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    return tv.tv_sec * 1000000000LL + (tv.tv_usec * 1000);
709317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
710317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
711317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner/* Warning: don't insert tracepoints into these functions, they are
712317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner   also used by simpletrace backend and tracepoints would cause
713317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner   an infinite recursion! */
714317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#ifdef _WIN32
715317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerextern int64_t clock_freq;
716317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
717317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock(void)
718317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
719317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    LARGE_INTEGER ti;
720317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    QueryPerformanceCounter(&ti);
721317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    return muldiv64(ti.QuadPart, get_ticks_per_sec(), clock_freq);
722317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
723317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
724317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#else
725317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
726317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerextern int use_rt_clock;
727317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner
728317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turnerstatic inline int64_t get_clock(void)
729317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner{
730f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner#ifdef CLOCK_MONOTONIC
731317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    if (use_rt_clock) {
732317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner        struct timespec ts;
733317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner        clock_gettime(CLOCK_MONOTONIC, &ts);
734317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner        return ts.tv_sec * 1000000000LL + ts.tv_nsec;
735317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    } else
736317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#endif
737317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    {
738317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner        /* XXX: using gettimeofday leads to problems if the date
739317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner           changes, so it should be avoided. */
740317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner        return get_clock_realtime();
741317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner    }
742317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner}
743317c9d54284844615b33a25834a63248bf1bfa73David 'Digit' Turner#endif
7446a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7456a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* icount */
7466a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerint64_t cpu_get_icount(void);
747f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turnerint64_t cpu_get_clock(void);
748f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner
7496a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/*******************************************/
7506a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* host CPU ticks (if available) */
7516a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7526a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#if defined(_ARCH_PPC)
7536a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7546a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
7556a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
7566a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int64_t retval;
7576a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#ifdef _ARCH_PPC64
7586a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    /* This reads timebase in one 64bit go and includes Cell workaround from:
7596a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner       http://ozlabs.org/pipermail/linuxppc-dev/2006-October/027052.html
7606a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    */
7616a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    __asm__ __volatile__ ("mftb    %0\n\t"
7626a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "cmpwi   %0,0\n\t"
7636a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "beq-    $-8"
7646a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          : "=r" (retval));
7656a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else
7666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    /* http://ozlabs.org/pipermail/linuxppc-dev/1999-October/003889.html */
7676a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    unsigned long junk;
7686a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    __asm__ __volatile__ ("mfspr   %1,269\n\t"  /* mftbu */
7696a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "mfspr   %L0,268\n\t" /* mftb */
7706a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "mfspr   %0,269\n\t"  /* mftbu */
7716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "cmpw    %0,%1\n\t"
7726a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          "bne     $-16"
7736a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                          : "=r" (retval), "=r" (junk));
7746a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
7756a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return retval;
7766a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
7776a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7786a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__i386__)
7796a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7806a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
7816a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
7826a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int64_t val;
7836a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile ("rdtsc" : "=A" (val));
7846a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return val;
7856a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
7866a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7876a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__x86_64__)
7886a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
7896a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
7906a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
7916a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    uint32_t low,high;
7926a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int64_t val;
7936a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile("rdtsc" : "=a" (low), "=d" (high));
7946a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    val = high;
7956a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    val <<= 32;
7966a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    val |= low;
7976a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return val;
7986a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
7996a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8006a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__hppa__)
8016a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8026a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
8036a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8046a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int val;
8056a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile ("mfctl %%cr16, %0" : "=r"(val));
8066a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return val;
8076a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8086a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8096a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__ia64)
8106a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8116a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
8126a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8136a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int64_t val;
8146a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile ("mov %0 = ar.itc" : "=r"(val) :: "memory");
8156a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return val;
8166a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8176a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8186a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__s390__)
8196a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8206a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
8216a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8226a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    int64_t val;
8236a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile("stck 0(%1)" : "=m" (val) : "a" (&val) : "cc");
8246a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return val;
8256a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8266a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
827f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner#elif defined(__sparc__)
8286a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8296a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks (void)
8306a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8316a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#if defined(_LP64)
8326a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    uint64_t        rval;
8336a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile("rd %%tick,%0" : "=r"(rval));
8346a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return rval;
8356a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else
836f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner    /* We need an %o or %g register for this.  For recent enough gcc
837f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner       there is an "h" constraint for that.  Don't bother with that.  */
8386a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    union {
8396a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner        uint64_t i64;
8406a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner        struct {
8416a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner            uint32_t high;
8426a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner            uint32_t low;
8436a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner        }       i32;
8446a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    } rval;
845f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner    asm volatile("rd %%tick,%%g1; srlx %%g1,32,%0; mov %%g1,%1"
846f01835519fdcb736449d64204c535cbc60f06ca6David 'Digit' Turner                 : "=r"(rval.i32.high), "=r"(rval.i32.low) : : "g1");
8476a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return rval.i64;
8486a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
8496a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8506a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8516a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__mips__) && \
8526a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    ((defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__))
8536a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/*
8546a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * binutils wants to use rdhwr only on mips32r2
8556a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * but as linux kernel emulate it, it's fine
8566a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner * to use it.
8576a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner *
8586a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner */
8596a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#define MIPS_RDHWR(rd, value) {                         \
8606a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner        __asm__ __volatile__ (".set   push\n\t"         \
8616a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                              ".set mips32r2\n\t"       \
8626a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                              "rdhwr  %0, "rd"\n\t"     \
8636a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                              ".set   pop"              \
8646a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner                              : "=r" (value));          \
8656a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    }
8666a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8676a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
8686a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8696a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    /* On kernels >= 2.6.25 rdhwr <reg>, $2 and $3 are emulated */
8706a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    uint32_t count;
8716a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    static uint32_t cyc_per_count = 0;
8726a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8736a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    if (!cyc_per_count) {
8746a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner        MIPS_RDHWR("$3", cyc_per_count);
8756a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    }
8766a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8776a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    MIPS_RDHWR("$2", count);
8786a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return (int64_t)(count * cyc_per_count);
8796a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8806a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8816a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#elif defined(__alpha__)
8826a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8836a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks(void)
8846a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
8856a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    uint64_t cc;
8866a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    uint32_t cur, ofs;
8876a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8886a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    asm volatile("rpcc %0" : "=r"(cc));
8896a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    cur = cc;
8906a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    ofs = cc >> 32;
8916a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return cur - ofs;
8926a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
8936a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
8946a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#else
8956a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner/* The host CPU doesn't have an easily accessible cycle counter.
8966a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner   Just return a monotonically increasing value.  This will be
8976a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner   totally wrong, but hopefully better than nothing.  */
8986a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t cpu_get_real_ticks (void)
8996a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
9006a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    static int64_t ticks = 0;
9016a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return ticks++;
9026a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
9036a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
9046a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
9056a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#ifdef CONFIG_PROFILER
9066a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerstatic inline int64_t profile_getclock(void)
9076a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner{
9086a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner    return cpu_get_real_ticks();
9096a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner}
9106a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
9116a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t qemu_time, qemu_time_start;
9126a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t tlb_flush_time;
9136a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turnerextern int64_t dev_time;
9146a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner#endif
9156a9ef1773bf874dea493ff3861782a1e577b67ddDavid Turner
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
917