mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-06 13:07:21 +00:00
threadpool, res_pjsip: Add serializer group shutdown API calls.
A module trying to unload needs to wait for all serializers it creates and uses to complete processing before unloading. ASTERISK-24907 Reported by: Kevin Harwell Change-Id: I8c80b90f2f82754e8dbb02ddf3c9121e5e966059
This commit is contained in:
@@ -195,6 +195,28 @@ int ast_threadpool_push(struct ast_threadpool *pool, int (*task)(void *data), vo
|
||||
*/
|
||||
void ast_threadpool_shutdown(struct ast_threadpool *pool);
|
||||
|
||||
struct ast_serializer_shutdown_group;
|
||||
|
||||
/*!
|
||||
* \brief Create a serializer group shutdown control object.
|
||||
* \since 13.5.0
|
||||
*
|
||||
* \return ao2 object to control shutdown of a serializer group.
|
||||
*/
|
||||
struct ast_serializer_shutdown_group *ast_serializer_shutdown_group_alloc(void);
|
||||
|
||||
/*!
|
||||
* \brief Wait for the serializers in the group to shutdown with timeout.
|
||||
* \since 13.5.0
|
||||
*
|
||||
* \param shutdown_group Group shutdown controller. (Returns 0 immediately if NULL)
|
||||
* \param timeout Number of seconds to wait for the serializers in the group to shutdown.
|
||||
* Zero if the timeout is disabled.
|
||||
*
|
||||
* \return Number of seriaizers that did not get shutdown within the timeout.
|
||||
*/
|
||||
int ast_serializer_shutdown_group_join(struct ast_serializer_shutdown_group *shutdown_group, int timeout);
|
||||
|
||||
/*!
|
||||
* \brief Get the threadpool serializer currently associated with this thread.
|
||||
* \since 14.0.0
|
||||
@@ -234,9 +256,40 @@ struct ast_taskprocessor *ast_threadpool_serializer_get_current(void);
|
||||
*
|
||||
* \param name Name of the serializer. (must be unique)
|
||||
* \param pool \ref ast_threadpool for execution.
|
||||
*
|
||||
* \return \ref ast_taskprocessor for enqueuing work.
|
||||
* \return \c NULL on error.
|
||||
*/
|
||||
struct ast_taskprocessor *ast_threadpool_serializer(const char *name, struct ast_threadpool *pool);
|
||||
|
||||
/*!
|
||||
* \brief Serialized execution of tasks within a \ref ast_threadpool.
|
||||
* \since 13.5.0
|
||||
*
|
||||
* A \ref ast_taskprocessor with the same contract as a default taskprocessor
|
||||
* (tasks execute serially) except instead of executing out of a dedicated
|
||||
* thread, execution occurs in a thread from a \ref ast_threadpool. Think of it
|
||||
* as a lightweight thread.
|
||||
*
|
||||
* While it guarantees that each task will complete before executing the next,
|
||||
* there is no guarantee as to which thread from the \c pool individual tasks
|
||||
* will execute. This normally only matters if your code relys on thread
|
||||
* specific information, such as thread locals.
|
||||
*
|
||||
* Use ast_taskprocessor_unreference() to dispose of the returned \ref
|
||||
* ast_taskprocessor.
|
||||
*
|
||||
* Only a single taskprocessor with a given name may exist. This function will fail
|
||||
* if a taskprocessor with the given name already exists.
|
||||
*
|
||||
* \param name Name of the serializer. (must be unique)
|
||||
* \param pool \ref ast_threadpool for execution.
|
||||
* \param shutdown_group Group shutdown controller. (NULL if no group association)
|
||||
*
|
||||
* \return \ref ast_taskprocessor for enqueuing work.
|
||||
* \return \c NULL on error.
|
||||
*/
|
||||
struct ast_taskprocessor *ast_threadpool_serializer_group(const char *name,
|
||||
struct ast_threadpool *pool, struct ast_serializer_shutdown_group *shutdown_group);
|
||||
|
||||
#endif /* ASTERISK_THREADPOOL_H */
|
||||
|
Reference in New Issue
Block a user