Merged revisions 301790 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Fri, 14 Jan 2011 17:34:28 +0000 (17:34 +0000)
committerJeff Peeler <jpeeler@digium.com>
Fri, 14 Jan 2011 17:34:28 +0000 (17:34 +0000)
commita0e4c4ee5ba8a65137c05c0239d04b0de0f6e4d3
treead863b1dc956a45b14a0bd46d969f46a0ba380be
parent89fe21382abf0c3e6a878ad667089e11d9df454e
Merged revisions 301790 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r301790 | jpeeler | 2011-01-14 11:32:52 -0600 (Fri, 14 Jan 2011) | 42 lines

  Resolve deadlock involving REFER.

  Two fixes:
  1) One must always have the private unlocked before calling
  pbx_builtin_setvar_helper to not invalidate locking order since it locks the
  channel.
  2) Unlock the channel before calling pbx_find_extension, which starts and stops
  autoservice during the lookup. The problem scenario as illustrated by the
  reporter:

  Thread: do_monitor
  -----------------------
  handle_request_do
   handle_incoming
    handle_request_refer
     ast_parking_ext_valid
      pbx_find_extension
       ast_autoservice_stop
        while (chan_list_state == as_chan_list_state) { usleep(1000); }

  Thread: autoservice_run
  -----------------------
  autoservice_run
   chan = ast_waitfor_n
    ast_waitfor_nandfds
     ast_waitfor_nandfds_classic / simple / complex (depending on your system)
      ast_channel_lock(c[x]);

  handle_request_do and schedule_process_request_queue locks the owner
  if it exists. The autoservice thread is waiting for the channel lock, which
  wasn't ever released since the do_monitor thread was waiting for autoservice
  operations to complete. Solved by unlocking the channel but keeping a reference
  to guarantee safety.

  (closes issue #18403)
  Reported by: jthurman
  Patches:
        20110103-blind_deadlock.diff uploaded by jthurman (license 614)
        issue18403.patch uploaded by jpeeler (license 325)
  Tested by: jthurman
........

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