Stage 1 of deadlock fix (bug #1673 -- but not yet solved, just started) and fix confi...
authorMark Spencer <markster@digium.com>
Thu, 20 May 2004 07:52:07 +0000 (07:52 +0000)
committerMark Spencer <markster@digium.com>
Thu, 20 May 2004 07:52:07 +0000 (07:52 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@3025 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
config.c

index 0e28fd1..0aa8f57 100755 (executable)
@@ -4538,8 +4538,17 @@ static int get_refer_info(struct sip_pvt *p, struct sip_request *oreq)
                p2 = iflist;
                while(p2) {
                        if (!strcmp(p2->callid, tmp5)) {
-                               /* Go ahead and lock it before returning */
+                               /* Go ahead and lock it (and its owner) before returning */
                                ast_mutex_lock(&p2->lock);
+                               if (p2->owner) {
+                                       while(ast_mutex_trylock(&p2->owner->lock)) {
+                                               ast_mutex_unlock(&p2->lock);
+                                               usleep(1);
+                                               ast_mutex_lock(&p2->lock);
+                                               if (!p2->owner)
+                                                       break;
+                                       }
+                               }
                                p->refer_call = p2;
                                break;
                        }
@@ -6471,6 +6480,8 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                                if (p->refer_call) {
                                        ast_log(LOG_DEBUG,"202 Accepted (supervised)\n");
                                        attempt_transfer(p, p->refer_call);
+                                       if (p->refer_call->owner)
+                                               ast_mutex_unlock(&p->refer_call->owner->lock);
                                        ast_mutex_unlock(&p->refer_call->lock);
                                        p->refer_call = NULL;
                                        p->gotrefer = 1;
index 574561a..954d095 100755 (executable)
--- a/config.c
+++ b/config.c
@@ -740,9 +740,8 @@ static struct ast_config *__ast_load(char *configfile, struct ast_config *tmp, s
                        return NULL;
                }
                while(!feof(f)) {
-                       fgets(buf, sizeof(buf), f);
                        lineno++;
-                       if (!feof(f)) {
+                       if (fgets(buf, sizeof(buf), f)) {
                                if (cfg_process(tmp, _tmpc, _last, buf, lineno, configfile, includelevel
 #ifdef PRESERVE_COMMENTS
                                , acs