This commit adds a scheduler API call, ast_sched_replace that can be used
[asterisk/asterisk.git] / include / asterisk / sched.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  * \brief Scheduler Routines (derived from cheops)
21  */
22
23 #ifndef _ASTERISK_SCHED_H
24 #define _ASTERISK_SCHED_H
25
26 #if defined(__cplusplus) || defined(c_plusplus)
27 extern "C" {
28 #endif
29
30 /*! \brief Max num of schedule structs
31  * \note The max number of schedule structs to keep around
32  * for use.  Undefine to disable schedule structure
33  * caching. (Only disable this on very low memory
34  * machines)
35  */
36 #define SCHED_MAX_CACHE 128
37
38 struct sched_context;
39
40 /*! \brief New schedule context
41  * \note Create a scheduling context
42  * \return Returns a malloc'd sched_context structure, NULL on failure
43  */
44 struct sched_context *sched_context_create(void);
45
46 /*! \brief destroys a schedule context
47  * Destroys (free's) the given sched_context structure
48  * \param c Context to free
49  * \return Returns 0 on success, -1 on failure
50  */
51 void sched_context_destroy(struct sched_context *c);
52
53 /*! \brief callback for a cheops scheduler
54  * A cheops scheduler callback takes a pointer with callback data and
55  * \return returns a 0 if it should not be run again, or non-zero if it should be
56  * rescheduled to run again
57  */
58 typedef int (*ast_sched_cb)(void *data);
59 #define AST_SCHED_CB(a) ((ast_sched_cb)(a))
60
61 /*! \brief Adds a scheduled event
62  * Schedule an event to take place at some point in the future.  callback
63  * will be called with data as the argument, when milliseconds into the
64  * future (approximately)
65  * If callback returns 0, no further events will be re-scheduled
66  * \param con Scheduler context to add
67  * \param when how many milliseconds to wait for event to occur
68  * \param callback function to call when the amount of time expires
69  * \param data data to pass to the callback
70  * \return Returns a schedule item ID on success, -1 on failure
71  */
72 int ast_sched_add(struct sched_context *con, int when, ast_sched_cb callback, void *data);
73
74 /*!
75  * \brief replace a scheduler entry
76  *
77  * This deletes the scheduler entry for old_id if it exists, and then
78  * calls ast_sched_add to create a new entry.  A negative old_id will
79  * be ignored.
80  *
81  * \retval -1 failure
82  * \retval otherwise, returns scheduled item ID
83  */
84 int ast_sched_replace(int old_id, struct sched_context *con, int when, ast_sched_cb callback, void *data);
85
86 /*!Adds a scheduled event with rescheduling support
87  * \param con Scheduler context to add
88  * \param when how many milliseconds to wait for event to occur
89  * \param callback function to call when the amount of time expires
90  * \param data data to pass to the callback
91  * \param variable If true, the result value of callback function will be
92  *       used for rescheduling
93  * Schedule an event to take place at some point in the future.  Callback
94  * will be called with data as the argument, when milliseconds into the
95  * future (approximately)
96  * If callback returns 0, no further events will be re-scheduled
97  * \return Returns a schedule item ID on success, -1 on failure
98  */
99 int ast_sched_add_variable(struct sched_context *con, int when, ast_sched_cb callback, void *data, int variable);
100
101 /*!
102  * \brief replace a scheduler entry
103  *
104  * This deletes the scheduler entry for old_id if it exists, and then
105  * calls ast_sched_add to create a new entry.  A negative old_id will
106  * be ignored.
107  *
108  * \retval -1 failure
109  * \retval otherwise, returns scheduled item ID
110  */
111 int ast_sched_replace_variable(int old_id, struct sched_context *con, int when, ast_sched_cb callback, void *data, int variable);
112
113 /*! \brief Deletes a scheduled event
114  * Remove this event from being run.  A procedure should not remove its
115  * own event, but return 0 instead.
116  * \param con scheduling context to delete item from
117  * \param id ID of the scheduled item to delete
118  * \return Returns 0 on success, -1 on failure
119  */
120 int ast_sched_del(struct sched_context *con, int id);
121
122 /*! \brief Determines number of seconds until the next outstanding event to take place
123  * Determine the number of seconds until the next outstanding event
124  * should take place, and return the number of milliseconds until
125  * it needs to be run.  This value is perfect for passing to the poll
126  * call.
127  * \param con context to act upon
128  * \return Returns "-1" if there is nothing there are no scheduled events
129  * (and thus the poll should not timeout)
130  */
131 int ast_sched_wait(struct sched_context *con);
132
133 /*! \brief Runs the queue
134  * \param con Scheduling context to run
135  * Run the queue, executing all callbacks which need to be performed
136  * at this time.
137  * \param con context to act upon
138  * \return Returns the number of events processed.
139  */
140 int ast_sched_runq(struct sched_context *con);
141
142 /*! \brief Dumps the scheduler contents
143  * Debugging: Dump the contents of the scheduler to stderr
144  * \param con Context to dump
145  */
146 void ast_sched_dump(const struct sched_context *con);
147
148 /*! \brief Returns the number of seconds before an event takes place
149  * \param con Context to use
150  * \param id Id to dump
151  */
152 long ast_sched_when(struct sched_context *con,int id);
153
154 /*!
155  * \brief Convenience macro for objects and reference (add)
156  *
157  */
158 #define ast_sched_add_object(obj,con,when,callback) ast_sched_add((con),(when),(callback), ASTOBJ_REF((obj)))
159
160 /*!
161  * \brief Convenience macro for objects and reference (del)
162  *
163  */
164 #define ast_sched_del_object(obj,destructor,con,id) do { \
165         if ((id) > -1) { \
166                 ast_sched_del((con),(id)); \
167                 (id) = -1; \
168                 ASTOBJ_UNREF((obj),(destructor)); \
169         } \
170 } while(0)
171
172 #if defined(__cplusplus) || defined(c_plusplus)
173 }
174 #endif
175
176 #endif /* _ASTERISK_SCHED_H */