Avoid possible deadlock on channel destruction
authorPaul Cadach <paul@odt.east.telecom.kz>
Sat, 23 Sep 2006 18:28:23 +0000 (18:28 +0000)
committerPaul Cadach <paul@odt.east.telecom.kz>
Sat, 23 Sep 2006 18:28:23 +0000 (18:28 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@43540 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_h323.c

index f167c07..38fb22c 100644 (file)
@@ -2433,34 +2433,36 @@ static void *do_monitor(void *data)
                        h323_do_reload();
                }
                /* Check for interfaces needing to be killed */
-               ast_mutex_lock(&iflock);
+               if (!ast_mutex_trylock(&iflock)) {
 #if 1
-               do {
-                       for (oh323 = iflist; oh323; oh323 = oh323->next) {
+                       do {
+                               for (oh323 = iflist; oh323; oh323 = oh323->next) {
+                                       if (!ast_mutex_trylock(&oh323->lock)) {
+                                               if (oh323->needdestroy) {
+                                                       __oh323_destroy(oh323);
+                                                       break;
+                                               }
+                                               ast_mutex_unlock(&oh323->lock);
+                                       }
+                               }
+                       } while (/*oh323*/ 0);
+#else
+restartsearch:
+                       oh323 = iflist;
+                       while(oh323) {
                                if (!ast_mutex_trylock(&oh323->lock)) {
                                        if (oh323->needdestroy) {
                                                __oh323_destroy(oh323);
-                                               break;
+                                               goto restartsearch;
                                        }
                                        ast_mutex_unlock(&oh323->lock);
+                                       oh323 = oh323->next;
                                }
                        }
-               } while (/*oh323*/ 0);
-#else
-restartsearch:
-               oh323 = iflist;
-               while(oh323) {
-                       if (!ast_mutex_trylock(&oh323->lock)) {
-                               if (oh323->needdestroy) {
-                                       __oh323_destroy(oh323);
-                                       goto restartsearch;
-                               }
-                               ast_mutex_unlock(&oh323->lock);
-                               oh323 = oh323->next;
-                       }
-               }
 #endif
-               ast_mutex_unlock(&iflock);
+                       ast_mutex_unlock(&iflock);
+               } else
+                       oh323 = (struct oh323_pvt *)1;  /* Force fast loop */
                pthread_testcancel();
                /* Wait for sched or io */
                res = ast_sched_wait(sched);