Annotation of win32/apache22/srclib/apr-util/include/apr_thread_pool.h, revision 1.1

1.1     ! moko        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 */

E-mail: