Timed-out trying to acquire PJSUA mutex

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Norman Franke wrote:
> OK, I think I tracked this one down.
> 
> on_call_state has the PJ lock.  I use a lock on my structure that  
> manages what call slots are active and related information.  
> Sometimes, I need to count the active calls. To do this, I lock my  
> lock then call pjsua_call_get_conf_port (which locks the PJ lock) to  
> make sure it has a valid port. No port, no active call (i..e. could  
> be just recently terminated or on hold.)
> 
> Another routine locks my lock, then calls any PJ function (locking  
> the PJ lock.) Thus we get deadlock.
> 
> Does PJ really need to maintain the lock while calling my on_call_setup?

on_call_setup()? did you mean on_call_state()?

Yes I think so. The only solution I think is to make the order of 
locking uniform in your application, perhaps by using something like 
this:

struct app_lock_data
{
   pjsua_call *call;
   pjsip_dialog *dlg;
};

pj_status_t app_lock(app_lock_data *lck, pjsua_call_id cid)
{
   pj_status_t status;

   lck->call = NULL;
   lck->dlg = NULL;

   if (cid != PJSUA_INVALID_ID) {
      status=acquire_call("app_lock()", cid, &lck->call, &lck->dlg);
      if (status == PJ_SUCCESS) {
        status = pj_mutex_lock(your_app_mutex);
        if (status != PJ_SUCCESS) {
           pjsip_dlg_dec_lock(lck->dlg);
        }
      }
   } else {
      status = PJSUA_LOCK();
      if (status == PJ_SUCCESS) {
        status = pj_mutex_lock(your_app_mutex);
        if (status != PJ_SUCCESS) {
           PJSUA_UNLOCK();
        }
      }
   }

   return status;
}

void app_unlock(app_lock_data *lck)
{
    if (lck->dlg) {
      pjsip_dlg_dec_lock(lck->dlg);
      lck->call = NULL;
      lck->dlg = NULL;
    } else {
      PJSUA_UNLOCK();
    }
}

In your other thread that needs acquiring mutex, use app_lock() and 
app_unlock() with something like this:

{
   app_lock_data lck;

   app_lock(&lck, PJSUA_INVALID_ID);
   // or
   // app_lock(&lck, call_id);

   .. access the protected data ..

   app_unlock(&lck);
}

In the callback context, we don't need to use app_lock() and 
app_unlock() and you can just lock your mutex as usual (although 
using app_lock() and app_unlock() here should be okay too I think).

cheers,
  -benny


> -Norman
> 
> On Dec 20, 2007, at 2:49 PM, Norman Franke wrote:
> 
>> Any idea what can cause this? It dies in pjsip_inv_answer called by
>> pjsua_call_answer while sending a code 180.
>>
>> 14:09:35.234   pjsua_call.c Timed-out trying to acquire PJSUA mutex
>> (possibly system has deadlocked) in pjsua_call_get_conf_port()
>> ../src/pjsip-ua/sip_inv.c:1666: failed assertion `inv->invite_tsx'
>> Program received signal:  "SIGABRT".
>>
>> Norman Franke
>> ASD, Inc.
>>
>>
>>
>> _______________________________________________
>> Visit our blog: http://blog.pjsip.org
>>
>> pjsip mailing list
>> pjsip at lists.pjsip.org
>> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
> 
> 
> 
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
> 
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org


-- 
Benny Prijono
http://www.pjsip.org



[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux