Make the threadpool listener opaque.

git-svn-id: https://origsvn.digium.com/svn/asterisk/team/mmichelson/threadpool@379126 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Michelson 2013-01-15 21:09:55 +00:00
parent 663479a558
commit 967e380ba8
3 changed files with 27 additions and 20 deletions

View File

@ -67,20 +67,6 @@ struct ast_threadpool_listener_callbacks {
void (*shutdown)(struct ast_threadpool_listener *listener);
};
/*!
* \brief listener for a threadpool
*
* The listener is notified of changes in a threadpool. It can
* react by doing things like increasing the number of threads
* in the pool
*/
struct ast_threadpool_listener {
/*! Callbacks called by the threadpool */
const struct ast_threadpool_listener_callbacks *callbacks;
/*! User data for the listener */
void *user_data;
};
struct ast_threadpool_options {
#define AST_THREADPOOL_OPTIONS_VERSION 1
/*! Version of thradpool options in use */
@ -128,6 +114,8 @@ struct ast_threadpool_options {
struct ast_threadpool_listener *ast_threadpool_listener_alloc(
const struct ast_threadpool_listener_callbacks *callbacks, void *user_data);
void *ast_threadpool_listener_get_user_data(const struct ast_threadpool_listener *listener);
/*!
* \brief Create a new threadpool
*

View File

@ -99,6 +99,20 @@ struct ast_threadpool {
struct ast_threadpool_options options;
};
/*!
* \brief listener for a threadpool
*
* The listener is notified of changes in a threadpool. It can
* react by doing things like increasing the number of threads
* in the pool
*/
struct ast_threadpool_listener {
/*! Callbacks called by the threadpool */
const struct ast_threadpool_listener_callbacks *callbacks;
/*! User data for the listener */
void *user_data;
};
/*!
* \brief states for worker threads
*/
@ -823,6 +837,11 @@ struct ast_threadpool_listener *ast_threadpool_listener_alloc(
return listener;
}
void *ast_threadpool_listener_get_user_data(const struct ast_threadpool_listener *listener)
{
return listener->user_data;
}
struct pool_options_pair {
struct ast_threadpool *pool;
struct ast_threadpool_options options;

View File

@ -65,7 +65,7 @@ static void test_state_changed(struct ast_threadpool *pool,
int active_threads,
int idle_threads)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
SCOPED_MUTEX(lock, &tld->lock);
tld->num_active = active_threads;
tld->num_idle = idle_threads;
@ -77,7 +77,7 @@ static void test_task_pushed(struct ast_threadpool *pool,
struct ast_threadpool_listener *listener,
int was_empty)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
SCOPED_MUTEX(lock, &tld->lock);
tld->task_pushed = 1;
++tld->num_tasks;
@ -88,7 +88,7 @@ static void test_task_pushed(struct ast_threadpool *pool,
static void test_emptied(struct ast_threadpool *pool,
struct ast_threadpool_listener *listener)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
SCOPED_MUTEX(lock, &tld->lock);
tld->empty_notice = 1;
ast_cond_signal(&tld->cond);
@ -96,7 +96,7 @@ static void test_emptied(struct ast_threadpool *pool,
static void test_shutdown(struct ast_threadpool_listener *listener)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
ast_cond_destroy(&tld->cond);
ast_mutex_destroy(&tld->lock);
}
@ -163,7 +163,7 @@ static enum ast_test_result_state wait_until_thread_state(struct ast_test *test,
static void wait_for_task_pushed(struct ast_threadpool_listener *listener)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
struct timeval start = ast_tvnow();
struct timespec end = {
.tv_sec = start.tv_sec + 5,
@ -235,7 +235,7 @@ static enum ast_test_result_state listener_check(
int num_idle,
int empty_notice)
{
struct test_listener_data *tld = listener->user_data;
struct test_listener_data *tld = ast_threadpool_listener_get_user_data(listener);
enum ast_test_result_state res = AST_TEST_PASS;
if (tld->task_pushed != task_pushed) {