summaryrefslogtreecommitdiff
path: root/include/asterisk/timing.h
blob: b345f2174d1401fc4d76b68f8bee448521b19b31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * Asterisk -- An open source telephony toolkit.
 *
 * Copyright (C) 2008, Digium, Inc.
 *
 * Kevin P. Fleming <kpfleming@digium.com>
 *
 * See http://www.asterisk.org for more information about
 * the Asterisk project. Please do not directly contact
 * any of the maintainers of this project for assistance;
 * the project provides a web site, mailing lists and IRC
 * channels for your use.
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License Version 2. See the LICENSE file
 * at the top of the source tree.
 */

/*!
  \file timing.h
  \brief Timing source management
  \author Kevin P. Fleming <kpfleming@digium.com>

  Portions of Asterisk require a timing source, a periodic trigger
  for media handling activities. The functions in this file allow
  a loadable module to provide a timing source for Asterisk and its
  modules, so that those modules can request a 'timing handle' when
  they require one. These handles are file descriptors, which can be
  used with select() or poll().

  The timing source used by Asterisk must provide the following
  features:

  1) Periodic triggers, with a configurable interval (specified as
     number of triggers per second).

  2) Multiple outstanding triggers, each of which must be 'acked'
     to clear it. Triggers must also be 'ackable' in quantity.

  3) Continuous trigger mode, which when enabled causes every call
     to poll() on the timer handle to immediately return.

  4) Multiple 'event types', so that the code using the timer can
     know whether the wakeup it received was due to a periodic trigger
     or a continuous trigger.
 */

#ifndef _ASTERISK_TIMING_H
#define _ASTERISK_TIMING_H

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

enum ast_timing_event {
	AST_TIMING_EVENT_EXPIRED = 1,
	AST_TIMING_EVENT_CONTINUOUS = 2,
};

/*!
 * \brief Timing module interface
 *
 * The public API calls for the timing API directly map to this interface.
 * So, the behavior of these calls should match the documentation of the
 * public API calls.
 */
struct ast_timing_functions {
	int (*timer_open)(unsigned int rate);
	void (*timer_close)(int handle);
	void (*timer_ack)(int handle, unsigned int quantity);
	int (*timer_enable_continuous)(int handle);
	int (*timer_disable_continuous)(int handle);
	enum ast_timing_event (*timer_get_event)(int handle);
};

/*!
 * \brief Install a set of timing functions.
 *
 * \param funcs An instance of the \c ast_timing_functions structure with pointers
 *        to the functions provided by the timing implementation.
 *
 * \retval NULL failure 
 * \retval non-Null handle to be passed to ast_uninstall_timing_functions() on success
 */
void *ast_install_timing_functions(struct ast_timing_functions *funcs);

/*!
 * \brief Uninstall a previously-installed set of timing functions.
 *
 * \param handle The handle returned from a prior successful call to
 *        ast_install_timing_functions().
 *
 * \return nothing
 */
void ast_uninstall_timing_functions(void *handle);

/*!
 * \brief Open a timing fd
 *
 * \arg rate number of timer ticks per second
 *
 * \retval -1 error, with errno set
 * \retval >=0 success
 */
int ast_timer_open(unsigned int rate);

/*!
 * \brief Close an opened timing handle
 *
 * \arg handle timing fd returned from timer_open()
 *
 * \return nothing
 */
void ast_timer_close(int handle);

/*!
 * \brief Acknowledge a timer event
 *
 * \arg handle timing fd returned from timer_open()
 * \arg quantity number of timer events to acknowledge
 *
 * \note This function should only be called if timer_get_event()
 *       returned AST_TIMING_EVENT_EXPIRED.
 *
 * \return nothing
 */
void ast_timer_ack(int handle, unsigned int quantity);

/*!
 * \brief Enable continuous mode
 *
 * \arg handle timing fd returned from timer_open()
 *
 * Continuous mode causes poll() on the timing fd to immediately return
 * always until continuous mode is disabled.
 *
 * \retval -1 failure, with errno set
 * \retval 0 success
 */
int ast_timer_enable_continuous(int handle);

/*!
 * \brief Disable continuous mode
 *
 * \arg handle timing fd returned from timer_close()
 *
 * \retval -1 failure, with errno set
 * \retval 0 success
 */
int ast_timer_disable_continous(int handle);

/*!
 * \brief Determine timing event
 *
 * \arg handle timing fd returned by timer_open()
 *
 * After poll() indicates that there is input on the timing fd, this will
 * be called to find out what triggered it.
 *
 * \return which event triggered the timing fd
 */
enum ast_timing_event ast_timer_get_event(int handle);

#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#endif /* _ASTERISK_TIMING_H */