#include "asterisk.h"
#include "asterisk/lock.h"
#include "asterisk/linkedlists.h"
#include "asterisk/utils.h"
#include "asterisk/options.h"
Go to the source code of this file.
Enumerations | |
enum | ast_tps_options { TPS_REF_DEFAULT = 0, TPS_REF_IF_EXISTS = (1 << 0) } |
ast_tps_options for specification of taskprocessor options More... | |
Functions | |
ast_taskprocessor * | ast_taskprocessor_get (char *name, enum ast_tps_options create) |
Get a reference to a taskprocessor with the specified name and create the taskprocessor if necessary. | |
const char * | ast_taskprocessor_name (struct ast_taskprocessor *tps) |
Return the name of the taskprocessor singleton. | |
int | ast_taskprocessor_push (struct ast_taskprocessor *tps, int(*task_exe)(void *datap), void *datap) |
Push a task into the specified taskprocessor queue and signal the taskprocessor thread. | |
void * | ast_taskprocessor_unreference (struct ast_taskprocessor *tps) |
Unreference the specified taskprocessor and its reference count will decrement. |
Definition in file taskprocessor.h.
enum ast_tps_options |
ast_tps_options for specification of taskprocessor options
Specify whether a taskprocessor should be created via ast_taskprocessor_get() if the taskprocessor does not already exist. The default behavior is to create a taskprocessor if it does not already exist and provide its reference to the calling function. To only return a reference to a taskprocessor if and only if it exists, use the TPS_REF_IF_EXISTS option in ast_taskprocessor_get().
TPS_REF_DEFAULT | return a reference to a taskprocessor, create one if it does not exist |
TPS_REF_IF_EXISTS | return a reference to a taskprocessor ONLY if it already exists |
Definition at line 58 of file taskprocessor.h.
00058 { 00059 /*! \brief return a reference to a taskprocessor, create one if it does not exist */ 00060 TPS_REF_DEFAULT = 0, 00061 /*! \brief return a reference to a taskprocessor ONLY if it already exists */ 00062 TPS_REF_IF_EXISTS = (1 << 0), 00063 };
struct ast_taskprocessor* ast_taskprocessor_get | ( | char * | name, | |
enum ast_tps_options | create | |||
) |
Get a reference to a taskprocessor with the specified name and create the taskprocessor if necessary.
The default behavior of instantiating a taskprocessor if one does not already exist can be disabled by specifying the TPS_REF_IF_EXISTS ast_tps_options as the second argument to ast_taskprocessor_get().
name | The name of the taskprocessor | |
create | Use 0 by default or specify TPS_REF_IF_EXISTS to return NULL if the taskprocessor does not already exist return A pointer to a reference counted taskprocessor under normal conditions, or NULL if the TPS_REF_IF_EXISTS reference type is specified and the taskprocessor does not exist |
Definition at line 407 of file taskprocessor.c.
References ao2_alloc, ao2_find, ao2_link, ao2_lock(), ao2_ref, ao2_unlock(), ast_calloc, ast_cond_init(), ast_log(), ast_mutex_init(), ast_pthread_create, AST_PTHREADT_NULL, ast_strdup, ast_strlen_zero(), LOG_ERROR, LOG_WARNING, ast_taskprocessor::name, OBJ_POINTER, tps_processing_function(), TPS_REF_IF_EXISTS, tps_singletons, and tps_taskprocessor_destroy().
Referenced by ast_event_init(), cli_tps_ping(), load_module(), and load_pbx().
00408 { 00409 struct ast_taskprocessor *p, tmp_tps = { 00410 .name = name, 00411 }; 00412 00413 if (ast_strlen_zero(name)) { 00414 ast_log(LOG_ERROR, "requesting a nameless taskprocessor!!!\n"); 00415 return NULL; 00416 } 00417 ao2_lock(tps_singletons); 00418 p = ao2_find(tps_singletons, &tmp_tps, OBJ_POINTER); 00419 if (p) { 00420 ao2_unlock(tps_singletons); 00421 return p; 00422 } 00423 if (create & TPS_REF_IF_EXISTS) { 00424 /* calling function does not want a new taskprocessor to be created if it doesn't already exist */ 00425 ao2_unlock(tps_singletons); 00426 return NULL; 00427 } 00428 /* create a new taskprocessor */ 00429 if (!(p = ao2_alloc(sizeof(*p), tps_taskprocessor_destroy))) { 00430 ao2_unlock(tps_singletons); 00431 ast_log(LOG_WARNING, "failed to create taskprocessor '%s'\n", name); 00432 return NULL; 00433 } 00434 00435 ast_cond_init(&p->poll_cond, NULL); 00436 ast_mutex_init(&p->taskprocessor_lock); 00437 00438 if (!(p->stats = ast_calloc(1, sizeof(*p->stats)))) { 00439 ao2_unlock(tps_singletons); 00440 ast_log(LOG_WARNING, "failed to create taskprocessor stats for '%s'\n", name); 00441 ao2_ref(p, -1); 00442 return NULL; 00443 } 00444 if (!(p->name = ast_strdup(name))) { 00445 ao2_unlock(tps_singletons); 00446 ao2_ref(p, -1); 00447 return NULL; 00448 } 00449 p->poll_thread_run = 1; 00450 p->poll_thread = AST_PTHREADT_NULL; 00451 if (ast_pthread_create(&p->poll_thread, NULL, tps_processing_function, p) < 0) { 00452 ao2_unlock(tps_singletons); 00453 ast_log(LOG_ERROR, "Taskprocessor '%s' failed to create the processing thread.\n", p->name); 00454 ao2_ref(p, -1); 00455 return NULL; 00456 } 00457 if (!(ao2_link(tps_singletons, p))) { 00458 ao2_unlock(tps_singletons); 00459 ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name); 00460 ao2_ref(p, -1); 00461 return NULL; 00462 } 00463 ao2_unlock(tps_singletons); 00464 return p; 00465 }
const char* ast_taskprocessor_name | ( | struct ast_taskprocessor * | tps | ) |
Return the name of the taskprocessor singleton.
Definition at line 395 of file taskprocessor.c.
References ast_log(), LOG_ERROR, and ast_taskprocessor::name.
00396 { 00397 if (!tps) { 00398 ast_log(LOG_ERROR, "no taskprocessor specified!\n"); 00399 return NULL; 00400 } 00401 return tps->name; 00402 }
int ast_taskprocessor_push | ( | struct ast_taskprocessor * | tps, | |
int(*)(void *datap) | task_exe, | |||
void * | datap | |||
) |
Push a task into the specified taskprocessor queue and signal the taskprocessor thread.
tps | The taskprocessor structure | |
task_exe | The task handling function to push into the taskprocessor queue | |
datap | The data to be used by the task handling function |
Definition at line 482 of file taskprocessor.c.
References ast_cond_signal(), AST_LIST_INSERT_TAIL, ast_log(), ast_mutex_lock(), ast_mutex_unlock(), LOG_ERROR, ast_taskprocessor::name, ast_taskprocessor::poll_cond, ast_taskprocessor::taskprocessor_lock, ast_taskprocessor::tps_queue, ast_taskprocessor::tps_queue_size, and tps_task_alloc().
Referenced by ast_event_queue(), cli_tps_ping(), device_state_cb(), mwi_sub_event_cb(), and mwi_unsub_event_cb().
00483 { 00484 struct tps_task *t; 00485 00486 if (!tps || !task_exe) { 00487 ast_log(LOG_ERROR, "%s is missing!!\n", (tps) ? "task callback" : "taskprocessor"); 00488 return -1; 00489 } 00490 if (!(t = tps_task_alloc(task_exe, datap))) { 00491 ast_log(LOG_ERROR, "failed to allocate task! Can't push to '%s'\n", tps->name); 00492 return -1; 00493 } 00494 ast_mutex_lock(&tps->taskprocessor_lock); 00495 AST_LIST_INSERT_TAIL(&tps->tps_queue, t, list); 00496 tps->tps_queue_size++; 00497 ast_cond_signal(&tps->poll_cond); 00498 ast_mutex_unlock(&tps->taskprocessor_lock); 00499 return 0; 00500 }
void* ast_taskprocessor_unreference | ( | struct ast_taskprocessor * | tps | ) |
Unreference the specified taskprocessor and its reference count will decrement.
Taskprocessors use astobj2 and will unlink from the taskprocessor singleton container and destroy themself when the taskprocessor reference count reaches zero.
tps | taskprocessor to unreference |
Definition at line 468 of file taskprocessor.c.
References ao2_link, ao2_lock(), ao2_ref, ao2_unlink, ao2_unlock(), and tps_singletons.
Referenced by unload_module().
00469 { 00470 if (tps) { 00471 ao2_lock(tps_singletons); 00472 ao2_unlink(tps_singletons, tps); 00473 if (ao2_ref(tps, -1) > 1) { 00474 ao2_link(tps_singletons, tps); 00475 } 00476 ao2_unlock(tps_singletons); 00477 } 00478 return NULL; 00479 }