]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/apr-util/include/apr_thread_pool.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / apr-util / include / apr_thread_pool.h
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed
4  * with this work for additional information regarding copyright
5  * ownership.  The ASF licenses this file to you under the Apache
6  * License, Version 2.0 (the "License"); you may not use this file
7  * except in compliance with the License.  You may obtain a copy of
8  * the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  * implied.  See the License for the specific language governing
16  * permissions and limitations under the License.
17  */
18
19 #ifndef APU_THREAD_POOL_H
20 #define APU_THREAD_POOL_H
21
22 #include "apu.h"
23 #include "apr_thread_proc.h"
24
25 /**
26  * @file apr_thread_pool.h
27  * @brief APR Thread Pool Library
28
29  * @remarks This library implements a thread pool using apr_thread_t. A thread
30  * pool is a set of threads that can be created in advance or on demand until a
31  * maximum number. When a task is scheduled, the thread pool will find an idle
32  * thread to handle the task. In case all existing threads are busy and the
33  * number of tasks in the queue is higher than the adjustable threshold, the
34  * pool will try to create a new thread to serve the task if the maximum number
35  * has not been reached. Otherwise, the task will be put into a queue based on
36  * priority, which can be valued from 0 to 255, with higher values being served
37  * first. If there are tasks with the same priority, the new task might be put at
38  * the top or at the bottom - it depends on which function is used to put the task.
39  *
40  * @remarks There may be the case where the thread pool can use up to the maximum
41  * number of threads at peak load, but having those threads idle afterwards. A
42  * maximum number of idle threads can be set so that the extra idling threads will
43  * be terminated to save system resources.
44  */
45 #if APR_HAS_THREADS
46
47 #ifdef __cplusplus
48 extern "C" {
49 #endif /* __cplusplus */
50
51 /**
52  * @defgroup APR_Util_TP Thread Pool routines
53  * @ingroup APR_Util
54  * @{
55  */
56
57 /** Opaque Thread Pool structure. */
58 typedef struct apr_thread_pool apr_thread_pool_t;
59
60 #define APR_THREAD_TASK_PRIORITY_LOWEST 0
61 #define APR_THREAD_TASK_PRIORITY_LOW 63
62 #define APR_THREAD_TASK_PRIORITY_NORMAL 127
63 #define APR_THREAD_TASK_PRIORITY_HIGH 191
64 #define APR_THREAD_TASK_PRIORITY_HIGHEST 255
65
66 /**
67  * Create a thread pool
68  * @param me The pointer in which to return the newly created apr_thread_pool
69  * object, or NULL if thread pool creation fails.
70  * @param init_threads The number of threads to be created initially, this number
71  * will also be used as the initial value for the maximum number of idle threads.
72  * @param max_threads The maximum number of threads that can be created
73  * @param pool The pool to use
74  * @return APR_SUCCESS if the thread pool was created successfully. Otherwise,
75  * the error code.
76  */
77 APU_DECLARE(apr_status_t) apr_thread_pool_create(apr_thread_pool_t **me,
78                                                  apr_size_t init_threads,
79                                                  apr_size_t max_threads,
80                                                  apr_pool_t *pool);
81
82 /**
83  * Destroy the thread pool and stop all the threads
84  * @return APR_SUCCESS if all threads are stopped.
85  */
86 APU_DECLARE(apr_status_t) apr_thread_pool_destroy(apr_thread_pool_t *me);
87
88 /**
89  * Schedule a task to the bottom of the tasks of same priority.
90  * @param me The thread pool
91  * @param func The task function
92  * @param param The parameter for the task function
93  * @param priority The priority of the task.
94  * @param owner Owner of this task.
95  * @return APR_SUCCESS if the task had been scheduled successfully
96  */
97 APU_DECLARE(apr_status_t) apr_thread_pool_push(apr_thread_pool_t *me,
98                                                apr_thread_start_t func,
99                                                void *param,
100                                                apr_byte_t priority,
101                                                void *owner);
102 /**
103  * Schedule a task to be run after a delay
104  * @param me The thread pool
105  * @param func The task function
106  * @param param The parameter for the task function
107  * @param time Time in microseconds
108  * @param owner Owner of this task.
109  * @return APR_SUCCESS if the task had been scheduled successfully
110  */
111 APU_DECLARE(apr_status_t) apr_thread_pool_schedule(apr_thread_pool_t *me,
112                                                    apr_thread_start_t func,
113                                                    void *param,
114                                                    apr_interval_time_t time,
115                                                    void *owner);
116
117 /**
118  * Schedule a task to the top of the tasks of same priority.
119  * @param me The thread pool
120  * @param func The task function
121  * @param param The parameter for the task function
122  * @param priority The priority of the task.
123  * @param owner Owner of this task.
124  * @return APR_SUCCESS if the task had been scheduled successfully
125  */
126 APU_DECLARE(apr_status_t) apr_thread_pool_top(apr_thread_pool_t *me,
127                                               apr_thread_start_t func,
128                                               void *param,
129                                               apr_byte_t priority,
130                                               void *owner);
131
132 /**
133  * Cancel tasks submitted by the owner. If there is any task from the owner that
134  * is currently running, the function will spin until the task finished.
135  * @param me The thread pool
136  * @param owner Owner of the task
137  * @return APR_SUCCESS if the task has been cancelled successfully
138  * @note The task function should not be calling cancel, otherwise the function
139  * may get stuck forever. The function assert if it detect such a case.
140  */
141 APU_DECLARE(apr_status_t) apr_thread_pool_tasks_cancel(apr_thread_pool_t *me,
142                                                        void *owner);
143
144 /**
145  * Get the current number of tasks waiting in the queue
146  * @param me The thread pool
147  * @return Number of tasks in the queue
148  */
149 APU_DECLARE(apr_size_t) apr_thread_pool_tasks_count(apr_thread_pool_t *me);
150
151 /**
152  * Get the current number of scheduled tasks waiting in the queue
153  * @param me The thread pool
154  * @return Number of scheduled tasks in the queue
155  */
156 APU_DECLARE(apr_size_t) apr_thread_pool_scheduled_tasks_count(apr_thread_pool_t *me);
157
158 /**
159  * Get the current number of threads
160  * @param me The thread pool
161  * @return Total number of threads
162  */
163 APU_DECLARE(apr_size_t) apr_thread_pool_threads_count(apr_thread_pool_t *me);
164
165 /**
166  * Get the current number of busy threads
167  * @param me The thread pool
168  * @return Number of busy threads
169  */
170 APU_DECLARE(apr_size_t) apr_thread_pool_busy_count(apr_thread_pool_t *me);
171
172 /**
173  * Get the current number of idle threads
174  * @param me The thread pool
175  * @return Number of idle threads
176  */
177 APU_DECLARE(apr_size_t) apr_thread_pool_idle_count(apr_thread_pool_t *me);
178
179 /**
180  * Access function for the maximum number of idle threads. Number of current
181  * idle threads will be reduced to the new limit.
182  * @param me The thread pool
183  * @param cnt The number
184  * @return The number of threads that were stopped.
185  */
186 APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_set(apr_thread_pool_t *me,
187                                                      apr_size_t cnt);
188
189 /**
190  * Get number of tasks that have run
191  * @param me The thread pool
192  * @return Number of tasks that have run
193  */
194 APU_DECLARE(apr_size_t)
195     apr_thread_pool_tasks_run_count(apr_thread_pool_t * me);
196
197 /**
198  * Get high water mark of the number of tasks waiting to run
199  * @param me The thread pool
200  * @return High water mark of tasks waiting to run
201  */
202 APU_DECLARE(apr_size_t)
203     apr_thread_pool_tasks_high_count(apr_thread_pool_t * me);
204
205 /**
206  * Get high water mark of the number of threads
207  * @param me The thread pool
208  * @return High water mark of threads in thread pool
209  */
210 APU_DECLARE(apr_size_t)
211     apr_thread_pool_threads_high_count(apr_thread_pool_t * me);
212
213 /**
214  * Get the number of idle threads that were destroyed after timing out
215  * @param me The thread pool
216  * @return Number of idle threads that timed out
217  */
218 APU_DECLARE(apr_size_t)
219     apr_thread_pool_threads_idle_timeout_count(apr_thread_pool_t * me);
220
221 /**
222  * Access function for the maximum number of idle threads
223  * @param me The thread pool
224  * @return The current maximum number
225  */
226 APU_DECLARE(apr_size_t) apr_thread_pool_idle_max_get(apr_thread_pool_t *me);
227
228 /**
229  * Access function for the maximum number of threads.
230  * @param me The thread pool
231  * @param cnt Number of threads
232  * @return The original maximum number of threads
233  */
234 APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_set(apr_thread_pool_t *me,
235                                                        apr_size_t cnt);
236
237 /**
238  * Access function for the maximum wait time (in microseconds) of an
239  * idling thread that exceeds the maximum number of idling threads.
240  * A non-zero value allows for the reaping of idling threads to shrink
241  * over time.  Which helps reduce thrashing.
242  * @param me The thread pool
243  * @param timeout The number of microseconds an idle thread should wait
244  * till it reaps itself
245  * @return The original maximum wait time
246  */
247 APU_DECLARE(apr_interval_time_t)
248     apr_thread_pool_idle_wait_set(apr_thread_pool_t * me,
249                                   apr_interval_time_t timeout);
250
251 /**
252  * Access function for the maximum wait time (in microseconds) of an
253  * idling thread that exceeds the maximum number of idling threads
254  * @param me The thread pool
255  * @return The current maximum wait time
256  */
257 APU_DECLARE(apr_interval_time_t)
258     apr_thread_pool_idle_wait_get(apr_thread_pool_t * me);
259
260 /**
261  * Access function for the maximum number of threads
262  * @param me The thread pool
263  * @return The current maximum number
264  */
265 APU_DECLARE(apr_size_t) apr_thread_pool_thread_max_get(apr_thread_pool_t *me);
266
267 /**
268  * Access function for the threshold of tasks in queue to trigger a new thread.
269  * @param me The thread pool
270  * @param cnt The new threshold
271  * @return The original threshold
272  */
273 APU_DECLARE(apr_size_t) apr_thread_pool_threshold_set(apr_thread_pool_t *me,
274                                                       apr_size_t val);
275
276 /**
277  * Access function for the threshold of tasks in queue to trigger a new thread.
278  * @param me The thread pool
279  * @return The current threshold
280  */
281 APU_DECLARE(apr_size_t) apr_thread_pool_threshold_get(apr_thread_pool_t * me);
282
283 /**
284  * Get owner of the task currently been executed by the thread.
285  * @param thd The thread is executing a task
286  * @param owner Pointer to receive owner of the task.
287  * @return APR_SUCCESS if the owner is retrieved successfully
288  */
289 APU_DECLARE(apr_status_t) apr_thread_pool_task_owner_get(apr_thread_t *thd,
290                                                          void **owner);
291
292 /** @} */
293
294 #ifdef __cplusplus
295 }
296 #endif
297
298 #endif /* APR_HAS_THREADS */
299 #endif /* !APR_THREAD_POOL_H */