VirtualBox

source: vbox/trunk/include/iprt/timer.h@ 4011

Last change on this file since 4011 was 3978, checked in by vboxsync, 17 years ago

Extended the RTTimerCreateEx interface by defining some flags for specifying the CPU(s) the timer should run on.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.9 KB
Line 
1/** @file
2 * innotek Portable Runtime - Timer.
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License as published by the Free Software Foundation,
12 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
13 * distribution. VirtualBox OSE is distributed in the hope that it will
14 * be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * If you received this file as part of a commercial VirtualBox
17 * distribution, then only the terms of your commercial VirtualBox
18 * license agreement apply instead of the previous paragraph.
19 */
20
21#ifndef ___iprt_timer_h
22#define ___iprt_timer_h
23
24
25#include <iprt/cdefs.h>
26#include <iprt/types.h>
27
28
29__BEGIN_DECLS
30
31/** @defgroup grp_rt_timer RTTimer - Timer
32 *
33 * The IPRT timer API provides a simple abstraction of recurring and one-shot callback timers.
34 *
35 * Because of the great variation in the native APIs and the quality of
36 * the service delivered by those native APIs, the timers are operated
37 * on at best effort basis.
38 *
39 * All the ring-3 implementations are naturally at the mercy of the scheduler,
40 * which means that the callback rate might vary quite a bit and we might skip
41 * ticks. Many systems have a restriction that a process can only have one
42 * timer. IPRT currently makes no efforts at multiplexing timers in those kind
43 * of situations and will simply fail if you try to create more than one timer.
44 *
45 * Things are generally better in ring-0. The implementations will use interrupt
46 * time callbacks wherever available, and if not, resort to a high priority
47 * kernel thread.
48 *
49 * @ingroup grp_rt
50 * @{
51 */
52
53
54/** Timer handle. */
55typedef struct RTTIMER *PRTTIMER;
56
57/**
58 * Timer callback function.
59 *
60 * The context this call is made in varies with different platforms and
61 * kernel / user mode IPRT.
62 *
63 * In kernel mode a timer callback should not waste time, it shouldn't
64 * waste stack and it should be prepared that some APIs might not work
65 * correctly because of weird OS restrictions in this context that we
66 * haven't discovered and avoided yet. Please fix those APIs so they
67 * at least avoid panics and weird behaviour.
68 *
69 * @param pTimer Timer handle.
70 * @param pvUser User argument.
71 */
72typedef DECLCALLBACK(void) FNRTTIMER(PRTTIMER pTimer, void *pvUser);
73/** Pointer to FNRTTIMER() function. */
74typedef FNRTTIMER *PFNRTTIMER;
75
76
77/**
78 * Create a recurring timer.
79 *
80 * @returns iprt status code.
81 * @param ppTimer Where to store the timer handle.
82 * @param uMilliesInterval Milliseconds between the timer ticks.
83 * This is rounded up to the system granularity.
84 * @param pfnTimer Callback function which shall be scheduled for execution
85 * on every timer tick.
86 * @param pvUser User argument for the callback.
87 * @see RTTimerDestroy, RTTimerStop
88 */
89RTDECL(int) RTTimerCreate(PRTTIMER *ppTimer, unsigned uMilliesInterval, PFNRTTIMER pfnTimer, void *pvUser);
90
91/**
92 * Create a suspended timer.
93 *
94 * @returns iprt status code.
95 * @param ppTimer Where to store the timer handle.
96 * @param u64NanoInterval The interval between timer ticks specified in nanoseconds if it's
97 * a recurring timer. This is rounded to the fit the system timer granularity.
98 * For one shot timers, pass 0.
99 * @param fFlags Timer flags.
100 * @param pfnTimer Callback function which shall be scheduled for execution
101 * on every timer tick.
102 * @param pvUser User argument for the callback.
103 * @see RTTimerStart, RTTimerStop, RTTimerDestroy, RTTimerGetSystemGranularity
104 */
105RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, unsigned fFlags, PFNRTTIMER pfnTimer, void *pvUser);
106
107/** @name RTTimerCreateEx flags
108 * @{ */
109/** Any CPU is fine. (Must be 0.) */
110#define RTTIMER_FLAGS_CPU_ANY 0
111/** One specific CPU */
112#define RTTIMER_FLAGS_CPU_SPECIFIC BIT(8)
113/** All online CPUs. */
114#define RTTIMER_FLAGS_CPU_ALL ( RTTIMER_FLAGS_CPU_MASK | RTTIMER_FLAGS_CPU_SPECIFIC )
115/** CPU mask. */
116#define RTTIMER_FLAGS_CPU_MASK 0xff
117/** Convert a CPU number (0-based) to RTTimerCreateEx flags.
118 * This will automatically OR in the RTTIMER_FLAG_CPU_SPECIFIC flag. */
119#define RTTIMER_FLAGS_CPU(iCpu) ( (iCpu) | RTTIMER_FLAG_CPU_SPECIFIC )
120/** Macro that validates the flags. */
121#define RTTIMER_FLAGS_IS_VALID(fFlags) ( !((fFlags) & ((fFlags) & RTTIMER_FLAGS_CPU_SPECIFIC ? 0x1ff : 0x100)) )
122/** @} */
123
124/**
125 * Stops and destroys a running timer.
126 *
127 * @returns iprt status code.
128 * @param pTimer Timer to stop and destroy. NULL is ok.
129 */
130RTDECL(int) RTTimerDestroy(PRTTIMER pTimer);
131
132/**
133 * Stops an active timer.
134 *
135 * @returns IPRT status code.
136 * @retval VERR_INVALID_HANDLE if pTimer isn't valid.
137 * @retval VERR_TIMER_ACTIVE if the timer isn't suspended.
138 *
139 * @param pTimer The timer to activate.
140 * @param u64First The RTTimeSystemNanoTS() for when the timer should start firing.
141 * If 0 is specified, the timer will fire ASAP.
142 * @see RTTimerStop
143 */
144RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First);
145
146/**
147 * Stops an active timer.
148 *
149 * @returns IPRT status code.
150 * @retval VERR_INVALID_HANDLE if pTimer isn't valid.
151 * @retval VERR_TIMER_SUSPENDED if the timer isn't active.
152 * @retval VERR_NOT_SUPPORTED if the IPRT implementation doesn't support stopping a timer.
153 *
154 * @param pTimer The timer to suspend.
155 * @see RTTimerStart
156 */
157RTDECL(int) RTTimerStop(PRTTIMER pTimer);
158
159
160/**
161 * Gets the (current) timer granularity of the system.
162 *
163 * @returns The timer granularity of the system in nanoseconds.
164 * @see RTTimerRequestSystemGranularity
165 */
166RTDECL(uint32_t) RTTimerGetSystemGranularity(void);
167
168/**
169 * Requests a specific system timer granularity.
170 *
171 * Successfull calls to this API must be coupled with the exact same number of
172 * calls to RTTimerReleaseSystemGranularity() in order to undo any changes made.
173 *
174 *
175 * @returns IPRT status code.
176 * @retval VERR_NOT_SUPPORTED if the requested value isn't supported by the host platform
177 * or if the host platform doesn't support modifying the system timer granularity.
178 * @retval VERR_PERMISSION_DENIED if the caller doesn't have the necessary privilege to
179 * modify the system timer granularity.
180 *
181 * @param u32Request The requested system timer granularity in nanoseconds.
182 * @param pu32Granted Where to store the granted system granularity. This is the value
183 * that should be passed to RTTimerReleaseSystemGranularity(). It
184 * is what RTTimerGetSystemGranularity() would return immediately
185 * after the change was made.
186 *
187 * The value differ from the request in two ways; rounding and
188 * scale. Meaning if your request is for 10.000.000 you might
189 * be granted 10.000.055 or 1.000.000.
190 * @see RTTimerReleaseSystemGranularity, RTTimerGetSystemGranularity
191 */
192RTDECL(int) RTTimerRequestSystemGranularity(uint32_t u32Request, uint32_t *pu32Granted);
193
194/**
195 * Releases a system timer granularity grant acquired by RTTimerRequestSystemGranularity().
196 *
197 * @returns IPRT status code.
198 * @retval VERR_NOT_SUPPORTED if the host platform doesn't have any way of modifying
199 * the system timer granularity.
200 * @retval VERR_WRONG_ORDER if nobody call RTTimerRequestSystemGranularity() with the
201 * given grant value.
202 * @param u32Granted The granted system granularity.
203 * @see RTTimerRequestSystemGranularity
204 */
205RTDECL(int) RTTimerReleaseSystemGranularity(uint32_t u32Granted);
206
207/** @} */
208
209__END_DECLS
210
211#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette