Solve the issue about the "CHANGE THIS" and "XXX CHANGE THIS XXX" taskprocessor names.

Unfortunately, this required a taskprocessor listener change that makes listener allocation
utterly silly. I'm going to change the scheme so that allocation of taskprocessor listeners
is done internally within taskprocessor code. This will make it parallel with threadpool
code, which is a good thing.



git-svn-id: https://origsvn.digium.com/svn/asterisk/team/mmichelson/threadpool@377687 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/78/78/1
Mark Michelson 13 years ago
parent 90d76a5026
commit 1310e659bd

@ -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 * 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. * 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 listener The listener the threadpool will notify of changes
* \param initial_size The number of threads for the pool to start with * \param initial_size The number of threads for the pool to start with
* \retval NULL Failed to create the threadpool * \retval NULL Failed to create the threadpool
* \retval non-NULL The newly-created 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); int initial_size, const struct ast_threadpool_options *options);
/*! /*!

@ -485,10 +485,6 @@ struct ast_taskprocessor_listener *ast_taskprocessor_listener_alloc(const struct
return NULL; return NULL;
} }
listener->callbacks = callbacks; listener->callbacks = callbacks;
listener->private_data = listener->callbacks->alloc(listener);
if (!listener->private_data) {
return NULL;
}
ao2_ref(listener, +1); ao2_ref(listener, +1);
return listener; return listener;
@ -559,6 +555,11 @@ struct ast_taskprocessor *ast_taskprocessor_create_with_listener(const char *nam
ao2_ref(p, +1); ao2_ref(p, +1);
listener->tps = p; listener->tps = p;
listener->private_data = listener->callbacks->alloc(listener);
if (!listener->private_data) {
return NULL;
}
if (!(ao2_link(tps_singletons, p))) { if (!(ao2_link(tps_singletons, p))) {
ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name); ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name);
return NULL; return NULL;

@ -349,8 +349,15 @@ static void *threadpool_alloc(struct ast_taskprocessor_listener *listener)
{ {
RAII_VAR(struct ast_threadpool *, pool, RAII_VAR(struct ast_threadpool *, pool,
ao2_alloc(sizeof(*pool), threadpool_destructor), ao2_cleanup); 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) { if (!pool->control_tps) {
return NULL; return NULL;
} }
@ -782,7 +789,8 @@ struct pool_options_pair {
struct ast_threadpool_options options; 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) int initial_size, const struct ast_threadpool_options *options)
{ {
struct ast_threadpool *pool; struct ast_threadpool *pool;
@ -795,7 +803,7 @@ struct ast_threadpool *ast_threadpool_create(struct ast_threadpool_listener *lis
return NULL; 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) { if (!tps) {
return NULL; return NULL;

@ -287,7 +287,7 @@ AST_TEST_DEFINE(threadpool_push)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_push"; info->name = "push";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test task"; info->summary = "Test task";
info->description = info->description =
@ -302,7 +302,7 @@ AST_TEST_DEFINE(threadpool_push)
return AST_TEST_FAIL; return AST_TEST_FAIL;
} }
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -340,7 +340,7 @@ AST_TEST_DEFINE(threadpool_thread_creation)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_thread_creation"; info->name = "thread_creation";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test threadpool thread creation"; info->summary = "Test threadpool thread creation";
info->description = info->description =
@ -356,7 +356,7 @@ AST_TEST_DEFINE(threadpool_thread_creation)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -389,7 +389,7 @@ AST_TEST_DEFINE(threadpool_thread_destruction)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_thread_destruction"; info->name = "thread_destruction";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test threadpool thread destruction"; info->summary = "Test threadpool thread destruction";
info->description = info->description =
@ -405,7 +405,7 @@ AST_TEST_DEFINE(threadpool_thread_destruction)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -447,7 +447,7 @@ AST_TEST_DEFINE(threadpool_thread_timeout)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_thread_timeout"; info->name = "thread_timeout";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test threadpool thread timeout"; info->summary = "Test threadpool thread timeout";
info->description = info->description =
@ -463,7 +463,7 @@ AST_TEST_DEFINE(threadpool_thread_timeout)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -509,7 +509,7 @@ AST_TEST_DEFINE(threadpool_one_task_one_thread)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_one_task_one_thread"; info->name = "one_task_one_thread";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test a single task with a single thread"; info->summary = "Test a single task with a single thread";
info->description = info->description =
@ -525,7 +525,7 @@ AST_TEST_DEFINE(threadpool_one_task_one_thread)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -585,7 +585,7 @@ AST_TEST_DEFINE(threadpool_one_thread_one_task)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_one_thread_one_task"; info->name = "one_thread_one_task";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test a single thread with a single task"; info->summary = "Test a single thread with a single task";
info->description = info->description =
@ -601,7 +601,7 @@ AST_TEST_DEFINE(threadpool_one_thread_one_task)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -664,7 +664,7 @@ AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_one_thread_multiple_tasks"; info->name = "one_thread_multiple_tasks";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test a single thread with multiple tasks"; info->summary = "Test a single thread with multiple tasks";
info->description = info->description =
@ -680,7 +680,7 @@ AST_TEST_DEFINE(threadpool_one_thread_multiple_tasks)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -755,7 +755,7 @@ AST_TEST_DEFINE(threadpool_reactivation)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_reactivation"; info->name = "reactivation";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test that a threadpool reactivates when work is added"; info->summary = "Test that a threadpool reactivates when work is added";
info->description = info->description =
@ -773,7 +773,7 @@ AST_TEST_DEFINE(threadpool_reactivation)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -917,7 +917,7 @@ AST_TEST_DEFINE(threadpool_task_distribution)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_task_distribution"; info->name = "task_distribution";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test that tasks are evenly distributed to threads"; info->summary = "Test that tasks are evenly distributed to threads";
info->description = info->description =
@ -934,7 +934,7 @@ AST_TEST_DEFINE(threadpool_task_distribution)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }
@ -1005,7 +1005,7 @@ AST_TEST_DEFINE(threadpool_more_destruction)
switch (cmd) { switch (cmd) {
case TEST_INIT: case TEST_INIT:
info->name = "threadpool_more_destruction"; info->name = "more_destruction";
info->category = "/main/threadpool/"; info->category = "/main/threadpool/";
info->summary = "Test that threads are destroyed as expected"; info->summary = "Test that threads are destroyed as expected";
info->description = info->description =
@ -1024,7 +1024,7 @@ AST_TEST_DEFINE(threadpool_more_destruction)
} }
tld = listener->private_data; tld = listener->private_data;
pool = ast_threadpool_create(listener, 0, &options); pool = ast_threadpool_create(info->name, listener, 0, &options);
if (!pool) { if (!pool) {
goto end; goto end;
} }

Loading…
Cancel
Save