Address further review feedback from David Lee.
[asterisk/asterisk.git] / main / taskprocessor.c
index 911eb76..fae9396 100644 (file)
@@ -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 */