[pjsip] How to hangup a call - the right way ??

Turnaev Eugeny turnaev at t72.ru
Wed May 21 01:20:43 EDT 2008

Hello.  I wrote a simple app using python and pjsua.

Which way one must hangup a call?
Do i have to wait after " status = py_pjsua.call_hangup(call_id, 0, None, None) " call
until callback on_call_state return that call is in py_pjsua.PJSIP_INV_STATE_DISCONNECTED state ?

I have a debug listing of my app where call to 
   status = py_pjsua.call_hangup(call_id, 0, None, None)
returned status => 0 but a call still alive and in active state.

In my app right after   py_pjsua.call_hangup(...), approx 100 lines of python code later
app start a new call with call_make_call without waiting a callback to return that previous
call is disconnected. From time to time it happens that call_hangup returns 0 but a call keeps
living in active state .. state text EARLY.. and total duration increments. i can send my app log if it needed.

For now i am just checking all calls and if call in state EARLY and total duration > 50 
i am trying to hang up it again.

So how do i work it around?
( If i have to wait for to call which i hangup with  status = py_pjsua.call_hangup and status => 0,
  i am afraid of getting stucked in waiting forever for some buggy call to disconnect,
  otherwise if not waiting i will end up with no free calls in pool,
  so i am now not waiting but trying to clean buggy calls, is there a better solution?)

By the way, even in cleaner function py_pjsua.call_hangup returned 0 for about a 5 times and 
total call duration before actual disconnect callback happened is 84 seconds while first hangup_call
was at total duration 50 seconds.


And also i have an annoying 
        pjsua_call.c Timed-out trying to acquire PJSUA mutex (possibly system has deadlocked) in pjsua_call_get_info()
in pjsua log.
What does this mean? Two threads entered pjsua_call_get_info simultaneously?
Looking at the time i suspected it happens when i am calling and call is not yet confirmed.
I am have on_call_state callback (where a call to ci = py_pjsua.call_get_info(call_id) is) and also
i am polling pjsip from my app in while loop.. ( also ci = py_pjsua.call_get_info(call_id) )..
but i did set up Semaphore object and every call to py_pjsua.call_get_info protected with .acquire()
in blocking mode.
        (in fact the whole on_call_state callback def is inside .acquire() .release() ... and the whole snip that is polling 
        with ci = py_pjsua.call_get_info(call_id) is in .acquire() .release() ( as long as ci is used )  )

        What other calls to py_pjsua i must take as critical area?

More information about the pjsip mailing list