diff options
Diffstat (limited to 'main/taskprocessor.c')
-rw-r--r-- | main/taskprocessor.c | 87 |
1 files changed, 49 insertions, 38 deletions
diff --git a/main/taskprocessor.c b/main/taskprocessor.c index 911eb76f8..fae93967a 100644 --- a/main/taskprocessor.c +++ b/main/taskprocessor.c @@ -1,7 +1,7 @@ /* * Asterisk -- An open source telephony toolkit. * - * Copyright (C) 2007-2008, Digium, Inc. + * Copyright (C) 2007-2013, Digium, Inc. * * Dwayne M. Hubbard <dhubbard@digium.com> * @@ -487,6 +487,50 @@ static void *default_listener_pvt_alloc(void) return pvt; } +static struct ast_taskprocessor *__allocate_taskprocessor(const char *name, struct ast_taskprocessor_listener *listener) +{ + RAII_VAR(struct ast_taskprocessor *, p, + ao2_alloc(sizeof(*p), tps_taskprocessor_destroy), ao2_cleanup); + + if (!p) { + ast_log(LOG_WARNING, "failed to create taskprocessor '%s'\n", name); + return NULL; + } + + if (!(p->stats = ast_calloc(1, sizeof(*p->stats)))) { + ast_log(LOG_WARNING, "failed to create taskprocessor stats for '%s'\n", name); + return NULL; + } + if (!(p->name = ast_strdup(name))) { + ao2_ref(p, -1); + return NULL; + } + + ao2_ref(listener, +1); + p->listener = listener; + + ao2_ref(p, +1); + listener->tps = p; + + if (!(ao2_link(tps_singletons, p))) { + ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name); + return NULL; + } + + if (p->listener->callbacks->start(p->listener)) { + ast_log(LOG_ERROR, "Unable to start taskprocessor listener for taskprocessor %s\n", p->name); + ast_taskprocessor_unreference(p); + return NULL; + } + + /* RAII_VAR will decrement the refcount at the end of the function. + * Since we want to pass back a reference to p, we bump the refcount + */ + ao2_ref(p, +1); + return p; + +} + /* Provide a reference to a taskprocessor. Create the taskprocessor if necessary, but don't * create the taskprocessor if we were told via ast_tps_options to return a reference only * if it already exists */ @@ -519,7 +563,7 @@ struct ast_taskprocessor *ast_taskprocessor_get(const char *name, enum ast_tps_o return NULL; } - p = ast_taskprocessor_create_with_listener(name, listener); + p = __allocate_taskprocessor(name, listener); if (!p) { default_listener_pvt_destroy(pvt); ao2_ref(listener, -1); @@ -534,46 +578,13 @@ struct ast_taskprocessor *ast_taskprocessor_get(const char *name, enum ast_tps_o struct ast_taskprocessor *ast_taskprocessor_create_with_listener(const char *name, struct ast_taskprocessor_listener *listener) { - RAII_VAR(struct ast_taskprocessor *, p, - ao2_alloc(sizeof(*p), tps_taskprocessor_destroy), - ao2_cleanup); - - if (!p) { - ast_log(LOG_WARNING, "failed to create taskprocessor '%s'\n", name); - return NULL; - } - - if (!(p->stats = ast_calloc(1, sizeof(*p->stats)))) { - ast_log(LOG_WARNING, "failed to create taskprocessor stats for '%s'\n", name); - return NULL; - } - if (!(p->name = ast_strdup(name))) { - ao2_ref(p, -1); - return NULL; - } - - ao2_ref(listener, +1); - p->listener = listener; - - ao2_ref(p, +1); - listener->tps = p; - - if (!(ao2_link(tps_singletons, p))) { - ast_log(LOG_ERROR, "Failed to add taskprocessor '%s' to container\n", p->name); - return NULL; - } + struct ast_taskprocessor *p = ao2_find(tps_singletons, name, OBJ_KEY); - if (p->listener->callbacks->start(p->listener)) { - ast_log(LOG_ERROR, "Unable to start taskprocessor listener for taskprocessor %s\n", p->name); + if (p) { ast_taskprocessor_unreference(p); return NULL; } - - /* RAII_VAR will decrement the refcount at the end of the function. - * Since we want to pass back a reference to p, we bump the refcount - */ - ao2_ref(p, +1); - return p; + return __allocate_taskprocessor(name, listener); } /* decrement the taskprocessor reference count and unlink from the container if necessary */ |