diff options
author | Joshua Colp <jcolp@digium.com> | 2006-05-25 16:14:17 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2006-05-25 16:14:17 +0000 |
commit | e0612c9835376294b081d0850c8808ed41e579aa (patch) | |
tree | 56c3ca698a277ee005f5b2ed70b7260f407ab1b6 | |
parent | 336fd1a2dea7f52f288d0759053f35db455db7fe (diff) |
Safely traverse the thread lists and wait until each thread is done before moving on to the next.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@30271 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_iax2.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index e685db8b3..e7e6cf3d6 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -7732,7 +7732,6 @@ static void *iax2_process_thread(void *data) ast_mutex_destroy(&thread->lock); ast_cond_destroy(&thread->cond); free(thread); - thread = NULL; return NULL; } @@ -8642,7 +8641,6 @@ static void delete_users(void) AST_LIST_TRAVERSE(&peers, peer, entry) ast_set_flag(peer, IAX_DELME); AST_LIST_UNLOCK(&peers); - } static void destroy_user(struct iax2_user *user) @@ -9681,6 +9679,7 @@ static struct ast_cli_entry iax2_cli[] = { static int __unload_module(void) { + pthread_t threadid = AST_PTHREADT_NULL; struct iax2_thread *thread = NULL; int x; @@ -9700,24 +9699,36 @@ static int __unload_module(void) /* Call for all threads to halt */ AST_LIST_LOCK(&idle_list); - AST_LIST_TRAVERSE(&idle_list, thread, list) { + AST_LIST_TRAVERSE_SAFE_BEGIN(&idle_list, thread, list) { + AST_LIST_REMOVE_CURRENT(&idle_list, list); + threadid = thread->threadid; thread->halt = 1; signal_condition(&thread->lock, &thread->cond); + pthread_join(threadid, NULL); } + AST_LIST_TRAVERSE_SAFE_END AST_LIST_UNLOCK(&idle_list); AST_LIST_LOCK(&active_list); - AST_LIST_TRAVERSE(&active_list, thread, list) { + AST_LIST_TRAVERSE_SAFE_BEGIN(&active_list, thread, list) { + AST_LIST_REMOVE_CURRENT(&active_list, list); + threadid = thread->threadid; thread->halt = 1; signal_condition(&thread->lock, &thread->cond); + pthread_join(threadid, NULL); } + AST_LIST_TRAVERSE_SAFE_END AST_LIST_UNLOCK(&active_list); AST_LIST_LOCK(&dynamic_list); - AST_LIST_TRAVERSE(&dynamic_list, thread, list) { + AST_LIST_TRAVERSE_SAFE_BEGIN(&dynamic_list, thread, list) { + AST_LIST_REMOVE_CURRENT(&dynamic_list, list); + threadid = thread->threadid; thread->halt = 1; signal_condition(&thread->lock, &thread->cond); + pthread_join(threadid, NULL); } + AST_LIST_TRAVERSE_SAFE_END AST_LIST_UNLOCK(&dynamic_list); ast_netsock_release(netsock); |