From 87492f6dd620cdd8547406a3f94e36eba0c64f3a Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Sun, 2 Dec 2007 09:42:48 +0000 Subject: Merged revisions 90432 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r90432 | tilghman | 2007-12-02 03:34:23 -0600 (Sun, 02 Dec 2007) | 7 lines Clarify the return value on autoservice. Specifically, if you started autoservice and autoservice was already on, it would erroneously return an error. Reported by: adiemus Patch by: dimas (Closes issue #11433) ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@90433 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/autoservice.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'main/autoservice.c') diff --git a/main/autoservice.c b/main/autoservice.c index 327d13199..568cf1070 100644 --- a/main/autoservice.c +++ b/main/autoservice.c @@ -130,7 +130,7 @@ static void *autoservice_run(void *ign) int ast_autoservice_start(struct ast_channel *chan) { - int res = -1; + int res = 0; struct asent *as; AST_RWLIST_WRLOCK(&aslist); @@ -144,11 +144,16 @@ int ast_autoservice_start(struct ast_channel *chan) } /* If not, start autoservice on channel */ - if (!as && (as = ast_calloc(1, sizeof(*as)))) { + if (as) { + /* Entry extist, autoservice is already handling this channel */ + } else if ((as = ast_calloc(1, sizeof(*as))) == NULL) { + /* Memory allocation failed */ + res = -1; + } else { + /* New entry created */ as->chan = chan; as->use_count = 1; AST_RWLIST_INSERT_HEAD(&aslist, as, list); - res = 0; if (asthread == AST_PTHREADT_NULL) { /* need start the thread */ if (ast_pthread_create_background(&asthread, NULL, autoservice_run, NULL)) { ast_log(LOG_WARNING, "Unable to create autoservice thread :(\n"); @@ -173,7 +178,7 @@ int ast_autoservice_stop(struct ast_channel *chan) struct asent *as; AST_LIST_HEAD_NOLOCK(, ast_frame) dtmf_frames; struct ast_frame *f; - int removed = 1; + int removed = 0; AST_LIST_HEAD_INIT_NOLOCK(&dtmf_frames); @@ -182,12 +187,11 @@ int ast_autoservice_stop(struct ast_channel *chan) if (as->chan == chan) { AST_RWLIST_REMOVE_CURRENT(list); as->use_count--; - if (as->use_count) { - removed = 0; + if (as->use_count) break; - } AST_LIST_APPEND_LIST(&dtmf_frames, &as->dtmf_frames, frame_list); ast_free(as); + removed = 1; if (!ast_check_hangup(chan)) res = 0; break; -- cgit v1.2.3