]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix an issue that I noticed in autoservice while mmichelson and I were debugging
authorRussell Bryant <russell@russellbryant.com>
Tue, 13 May 2008 21:05:57 +0000 (21:05 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 13 May 2008 21:05:57 +0000 (21:05 +0000)
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/branches/1.4@115990 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/autoservice.c

index 88ab0d4e60b6b1b0d7745d9ae1f6106be6472493..fb0840f92ebd38643f8d8e0f3ad81996b3804f41 100644 (file)
@@ -201,25 +201,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;
 }