summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/threadpool.h4
-rw-r--r--main/taskprocessor.c9
-rw-r--r--main/threadpool.c14
-rw-r--r--tests/test_threadpool.c40
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;
}