diff options
-rw-r--r-- | include/asterisk/threadpool.h | 4 | ||||
-rw-r--r-- | main/taskprocessor.c | 9 | ||||
-rw-r--r-- | main/threadpool.c | 14 | ||||
-rw-r--r-- | tests/test_threadpool.c | 40 |
4 files changed, 39 insertions, 28 deletions
diff --git a/include/asterisk/threadpool.h b/include/asterisk/threadpool.h index 3f3634129..9834d9180 100644 --- a/include/asterisk/threadpool.h +++ b/include/asterisk/threadpool.h @@ -113,12 +113,14 @@ struct ast_threadpool_listener *ast_threadpool_listener_alloc( * This function creates a threadpool. Tasks may be pushed onto this thread pool * in and will be automatically acted upon by threads within the pool. * + * \param name The name for the threadpool * \param listener The listener the threadpool will notify of changes * \param initial_size The number of threads for the pool to start with * \retval NULL Failed to create the threadpool * \retval non-NULL The newly-created threadpool */ -struct ast_threadpool *ast_threadpool_create(struct ast_threadpool_listener *listener, +struct ast_threadpool *ast_threadpool_create(const char *name, + struct ast_threadpool_listener *listener, int initial_size, const struct ast_threadpool_options *options); /*! diff --git a/main/taskprocessor.c b/main/taskprocessor.c index fc183b409..a1e54a3b4 100644 --- a/main/taskprocessor.c +++ b/main/taskprocessor.c @@ -485,10 +485,6 @@ struct ast_taskprocessor_listener *ast_taskprocessor_listener_alloc(const struct return NULL; } listener->callbacks = callbacks; - listener->private_data = listener->callbacks->alloc(listener); - if (!listener->private_data) { - return NULL; - } ao2_ref(listener, +1); return listener; @@ -559,6 +555,11 @@ struct ast_taskprocessor *ast_taskprocessor_create_with_listener(const char *nam ao2_ref(p, +1); listener->tps = p; + listener->private_data = listener->callbacks->alloc(listener); + if (!listener->private_data) { + return NULL; + } + if (!(ao2_link(tps_singletons, p))) { ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name); return NULL; diff --git a/main/threadpool.c b/main/threadpool.c index 18c1349ae..ee60dc7e3 100644 --- a/main/threadpool.c +++ b/main/threadpool.c @@ -349,8 +349,15 @@ static void *threadpool_alloc(struct ast_taskprocessor_listener *listener) { RAII_VAR(struct ast_threadpool *, pool, ao2_alloc(sizeof(*pool), threadpool_destructor), ao2_cleanup); + struct ast_str *name = ast_str_create(64); - pool->control_tps = ast_taskprocessor_get("CHANGE THIS", TPS_REF_DEFAULT); + if (!name) { + return NULL; + } + + ast_str_set(&name, 0, "%s-control", ast_taskprocessor_name(listener->tps)); + + pool->control_tps = ast_taskprocessor_get(ast_str_buffer(name), TPS_REF_DEFAULT); if (!pool->control_tps) { return NULL; } @@ -782,7 +789,8 @@ struct pool_options_pair { struct ast_threadpool_options options; }; -struct ast_threadpool *ast_threadpool_create(struct ast_threadpool_listener *listener, +struct ast_threadpool *ast_threadpool_create(const char *name, + struct ast_threadpool_listener *listener, int initial_size, const struct ast_threadpool_options *options) { struct ast_threadpool *pool; @@ -795,7 +803,7 @@ struct ast_threadpool *ast_threadpool_create(struct ast_threadpool_listener *lis return NULL; } - tps = ast_taskprocessor_create_with_listener("XXX CHANGE THIS XXX", tps_listener); + tps = ast_taskprocessor_create_with_listener(name, tps_listener); if (!tps) { return NULL; diff --git a/tests/test_threadpool.c b/tests/test_threadpool.c index 23fee0fda..4fe63e222 100644 --- a/tests/test_threadpool.c +++ b/tests/test_threadpool.c @@ -287,7 +287,7 @@ AST_TEST_DEFINE(threadpool_push) switch (cmd) { case TEST_INIT: - info->name = "threadpool_push"; + info->name = "push"; info->category = "/main/threadpool/"; info->summary = "Test task"; info->description = @@ -302,7 +302,7 @@ AST_TEST_DEFINE(threadpool_push) return AST_TEST_FAIL; } - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -340,7 +340,7 @@ AST_TEST_DEFINE(threadpool_thread_creation) switch (cmd) { case TEST_INIT: - info->name = "threadpool_thread_creation"; + info->name = "thread_creation"; info->category = "/main/threadpool/"; info->summary = "Test threadpool thread creation"; info->description = @@ -356,7 +356,7 @@ AST_TEST_DEFINE(threadpool_thread_creation) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -389,7 +389,7 @@ AST_TEST_DEFINE(threadpool_thread_destruction) switch (cmd) { case TEST_INIT: - info->name = "threadpool_thread_destruction"; + info->name = "thread_destruction"; info->category = "/main/threadpool/"; info->summary = "Test threadpool thread destruction"; info->description = @@ -405,7 +405,7 @@ AST_TEST_DEFINE(threadpool_thread_destruction) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -447,7 +447,7 @@ AST_TEST_DEFINE(threadpool_thread_timeout) switch (cmd) { case TEST_INIT: - info->name = "threadpool_thread_timeout"; + info->name = "thread_timeout"; info->category = "/main/threadpool/"; info->summary = "Test threadpool thread timeout"; info->description = @@ -463,7 +463,7 @@ AST_TEST_DEFINE(threadpool_thread_timeout) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -509,7 +509,7 @@ AST_TEST_DEFINE(threadpool_one_task_one_thread) switch (cmd) { case TEST_INIT: - info->name = "threadpool_one_task_one_thread"; + info->name = "one_task_one_thread"; info->category = "/main/threadpool/"; info->summary = "Test a single task with a single thread"; info->description = @@ -525,7 +525,7 @@ AST_TEST_DEFINE(threadpool_one_task_one_thread) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -585,7 +585,7 @@ AST_TEST_DEFINE(threadpool_one_thread_one_task) switch (cmd) { case TEST_INIT: - info->name = "threadpool_one_thread_one_task"; + info->name = "one_thread_one_task"; info->category = "/main/threadpool/"; info->summary = "Test a single thread with a single task"; info->description = @@ -601,7 +601,7 @@ AST_TEST_DEFINE(threadpool_one_thread_one_task) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -664,7 +664,7 @@ AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks) switch (cmd) { case TEST_INIT: - info->name = "threadpool_one_thread_multiple_tasks"; + info->name = "one_thread_multiple_tasks"; info->category = "/main/threadpool/"; info->summary = "Test a single thread with multiple tasks"; info->description = @@ -680,7 +680,7 @@ AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -755,7 +755,7 @@ AST_TEST_DEFINE(threadpool_reactivation) switch (cmd) { case TEST_INIT: - info->name = "threadpool_reactivation"; + info->name = "reactivation"; info->category = "/main/threadpool/"; info->summary = "Test that a threadpool reactivates when work is added"; info->description = @@ -773,7 +773,7 @@ AST_TEST_DEFINE(threadpool_reactivation) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -917,7 +917,7 @@ AST_TEST_DEFINE(threadpool_task_distribution) switch (cmd) { case TEST_INIT: - info->name = "threadpool_task_distribution"; + info->name = "task_distribution"; info->category = "/main/threadpool/"; info->summary = "Test that tasks are evenly distributed to threads"; info->description = @@ -934,7 +934,7 @@ AST_TEST_DEFINE(threadpool_task_distribution) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } @@ -1005,7 +1005,7 @@ AST_TEST_DEFINE(threadpool_more_destruction) switch (cmd) { case TEST_INIT: - info->name = "threadpool_more_destruction"; + info->name = "more_destruction"; info->category = "/main/threadpool/"; info->summary = "Test that threads are destroyed as expected"; info->description = @@ -1024,7 +1024,7 @@ AST_TEST_DEFINE(threadpool_more_destruction) } tld = listener->private_data; - pool = ast_threadpool_create(listener, 0, &options); + pool = ast_threadpool_create(info->name, listener, 0, &options); if (!pool) { goto end; } |