Changeset 5307


Ignore:
Timestamp:
May 19, 2016 4:30:05 AM (9 years ago)
Author:
riza
Message:

Re #1918: Fixed continous looping when trying to resolve STUN server due to lock handling.
Also move the unusable server to the least prioritize to be chosen on the fallback process.

Location:
pjproject/trunk/pjsip
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r5297 r5307  
    20492049    pj_sockaddr      addr; 
    20502050 
     2051    /** 
     2052     * The index of the usable STUN server. 
     2053     */ 
     2054    unsigned         index; 
    20512055}; 
    20522056 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r5288 r5307  
    436436    pj_status_t          stun_status; /**< STUN server status.          */ 
    437437    pjsua_stun_resolve   stun_res;  /**< List of pending STUN resolution*/ 
    438     pj_dns_resolver     *resolver;  /**< DNS resolver.                  */ 
     438    unsigned             stun_srv_idx; /**< Resolved STUN server index  */ 
     439    pj_dns_resolver     *resolver;  /**< DNS resolver.                  */    
    439440 
    440441    /* Detected NAT type */ 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r5297 r5307  
    12061206    result.status = sess->status; 
    12071207    result.name = sess->srv[sess->idx]; 
     1208    result.index = sess->idx; 
    12081209    pj_memcpy(&result.addr, &sess->addr, sizeof(result.addr)); 
    12091210    sess->has_result = PJ_TRUE; 
     
    15091510    if ((result->status == PJ_SUCCESS) && (pjsua_var.ua_cfg.stun_srv_cnt>0)) { 
    15101511        pj_memcpy(&pjsua_var.stun_srv, &result->addr, sizeof(result->addr)); 
     1512        pjsua_var.stun_srv_idx = result->index; 
    15111513 
    15121514        /* Perform NAT type detection if not yet */ 
     
    15551557         */ 
    15561558        if (wait) { 
    1557             while (pjsua_var.stun_status == PJ_EPENDING) { 
     1559            pj_bool_t has_pjsua_lock = PJSUA_LOCK_IS_LOCKED(); 
     1560 
     1561            if (has_pjsua_lock) 
     1562                PJSUA_UNLOCK(); 
     1563 
     1564            while (pjsua_var.stun_status == PJ_EPENDING) {               
    15581565                /* If there is no worker thread or 
    15591566                 * the function is called from the only worker thread, 
     
    15691576                } 
    15701577            } 
     1578            if (has_pjsua_lock) 
     1579                PJSUA_LOCK(); 
    15711580        } 
    15721581    } 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_media.c

    r5297 r5307  
    394394                ((acc->cfg.media_stun_use & PJSUA_STUN_RETRY_ON_FAILURE)!=0)) 
    395395            { 
    396                 PJ_LOG(4,(THIS_FILE, "Failed to get STUN mapped address, " 
    397                                      "retrying other STUN servers")); 
     396                pj_str_t srv =  
     397                             pjsua_var.ua_cfg.stun_srv[pjsua_var.stun_srv_idx]; 
     398 
     399                PJ_LOG(4,(THIS_FILE, "Failed to get STUN mapped address, " 
     400                       "retrying other STUN servers")); 
     401 
     402                if (pjsua_var.stun_srv_idx < pjsua_var.ua_cfg.stun_srv_cnt-1) { 
     403                    PJSUA_LOCK(); 
     404                    /* Move the unusable STUN server to the last position 
     405                     * as the least prioritize. 
     406                     */ 
     407                    pj_array_erase(pjsua_var.ua_cfg.stun_srv,  
     408                                   sizeof(pj_str_t), 
     409                                   pjsua_var.ua_cfg.stun_srv_cnt, 
     410                                   pjsua_var.stun_srv_idx); 
     411 
     412                    pj_array_insert(pjsua_var.ua_cfg.stun_srv,  
     413                                    sizeof(pj_str_t), 
     414                                    pjsua_var.ua_cfg.stun_srv_cnt-1, 
     415                                    pjsua_var.ua_cfg.stun_srv_cnt-1, 
     416                                    &srv); 
     417 
     418                    PJSUA_UNLOCK(); 
     419                } 
    398420                status=pjsua_update_stun_servers(pjsua_var.ua_cfg.stun_srv_cnt, 
    399421                                                 pjsua_var.ua_cfg.stun_srv, 
    400                                                  PJ_TRUE); 
     422                                                 PJ_FALSE); 
     423 
     424                if (status == PJ_SUCCESS) 
     425                    status = resolve_stun_server(PJ_TRUE); 
     426 
    401427                if (status == PJ_SUCCESS) { 
    402428                    if (pjsua_var.stun_srv.addr.sa_family != 0) { 
Note: See TracChangeset for help on using the changeset viewer.