]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 115990 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Tue, 13 May 2008 21:07:59 +0000 (21:07 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 13 May 2008 21:07:59 +0000 (21:07 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r115990 | russell | 2008-05-13 16:05:57 -0500 (Tue, 13 May 2008) | 5 lines

Fix an issue that I noticed in autoservice while mmichelson and I were debugging
a different problem.  I noticed that it was theoretically possible for two threads
to attempt to start the autoservice thread at the same time.  This change makes the
process of starting the autoservice thread, thread-safe.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@116001 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/autoservice.c

index d34883389dca7c09c0d67dda121e6108b5594ac6..c2550916a82c7aae5ee143abc7d0200e1865232e 100644 (file)
@@ -195,25 +195,29 @@ int ast_autoservice_start(struct ast_channel *chan)
        ast_channel_unlock(chan);
 
        AST_LIST_LOCK(&aslist);
-       if (AST_LIST_EMPTY(&aslist))
+
+       if (AST_LIST_EMPTY(&aslist) && asthread != AST_PTHREADT_NULL) {
                ast_cond_signal(&as_cond);
+       }
+
        AST_LIST_INSERT_HEAD(&aslist, as, list);
-       AST_LIST_UNLOCK(&aslist);
 
        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");
                        /* There will only be a single member in the list at this point,
                           the one we just added. */
-                       AST_LIST_LOCK(&aslist);
                        AST_LIST_REMOVE(&aslist, as, list);
-                       AST_LIST_UNLOCK(&aslist);
                        free(as);
+                       asthread = AST_PTHREADT_NULL;
                        res = -1;
-               } else
+               } else {
                        pthread_kill(asthread, SIGURG);
+               }
        }
 
+       AST_LIST_UNLOCK(&aslist);
+
        return res;
 }