Changeset 6090


Ignore:
Timestamp:
Oct 11, 2019 2:23:03 AM (5 weeks ago)
Author:
nanang
Message:

Fixed #2243:

  • pjsip_tpmgr_acquire_transport2() should skip transports being shutdown in the lookup iteration.
  • Added some tracing logs in sip_transport.c.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r6089 r6090  
    5050                 str, sizeof(str)); 
    5151    return str; 
     52} 
     53static const char* print_tpsel_info(const pjsip_tpselector *sel) 
     54{ 
     55    static char tpsel_info_buf[80]; 
     56    if (!sel) return "(null)"; 
     57    if (sel->type==PJSIP_TPSELECTOR_LISTENER) 
     58        pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf), 
     59                         "listener[%s], reuse=%d", sel->u.listener->obj_name, 
     60                         !sel->disable_connection_reuse); 
     61    else if (sel->type==PJSIP_TPSELECTOR_TRANSPORT) 
     62        pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf), 
     63                         "transport[%s], reuse=%d", sel->u.transport->info, 
     64                         !sel->disable_connection_reuse); 
     65    else 
     66        pj_ansi_snprintf(tpsel_info_buf, sizeof(tpsel_info_buf), 
     67                         "unknown[%p], reuse=%d", sel->u.ptr, 
     68                         !sel->disable_connection_reuse); 
     69    return tpsel_info_buf; 
    5270} 
    5371#else 
     
    12261244         */ 
    12271245        pj_list_push_back(tp_ref, tp_add); 
     1246        TRACE_((THIS_FILE, "Remote address already registered, " 
     1247                           "appended the transport to the list")); 
    12281248    } else { 
    12291249        /* Transport list not found, add it to the hash table. */ 
    12301250        pj_hash_set_np(mgr->table, &tp->key, key_len, hval, tp_add->tp_buf, 
    12311251                       tp_add); 
     1252        TRACE_((THIS_FILE, "Remote address not registered, " 
     1253                           "added the transport to the hash")); 
    12321254    } 
    12331255 
     
    12991321                        pj_hash_set_np(mgr->table, &tp_next->tp->key, key_len, 
    13001322                                       hval, tp_next->tp_buf, tp_next); 
     1323                        TRACE_((THIS_FILE, "Hash entry updated after " 
     1324                                           "transport %d being destroyed", 
     1325                                           tp->obj_name)); 
     1326                    } else { 
     1327                        TRACE_((THIS_FILE, "Hash entry deleted after " 
     1328                                           "transport %d being destroyed", 
     1329                                           tp->obj_name)); 
    13011330                    } 
    13021331                } 
     
    13101339            tp_iter = tp_iter->next; 
    13111340        } while (tp_iter != tp_ref); 
     1341 
     1342        if (tp_iter->tp != tp) { 
     1343            PJ_LOG(3, (THIS_FILE, "Warning: transport %s being destroyed is " 
     1344                                  "not registered", tp->obj_name)); 
     1345        } 
     1346    } else { 
     1347        PJ_LOG(3, (THIS_FILE, "Warning: transport %s being destroyed is " 
     1348                              "not found in the hash table", tp->obj_name)); 
    13121349    } 
    13131350 
     
    21752212} 
    21762213 
     2214 
    21772215/* 
    21782216 * pjsip_tpmgr_acquire_transport2() 
     
    21922230    pj_status_t status; 
    21932231 
    2194     TRACE_((THIS_FILE,"Acquiring transport type=%s, remote=%s:%d", 
     2232    TRACE_((THIS_FILE,"Acquiring transport type=%s, sel=%s remote=%s:%d", 
    21952233                       pjsip_transport_get_type_name(type), 
     2234                       print_tpsel_info(sel), 
    21962235                       addr_string(remote), 
    21972236                       pj_sockaddr_get_port(remote))); 
     
    22102249        if (seltp->key.type != type) { 
    22112250            pj_lock_release(mgr->lock); 
     2251            TRACE_((THIS_FILE, "Transport type in tpsel not matched")); 
    22122252            return PJSIP_ETPNOTSUITABLE; 
    22132253        } 
     
    22502290            if (sel->u.listener->type != type) { 
    22512291                pj_lock_release(mgr->lock); 
     2292                TRACE_((THIS_FILE, "Listener type in tpsel not matched")); 
    22522293                return PJSIP_ETPNOTSUITABLE; 
    22532294            } 
     
    22652306                                                NULL); 
    22662307            if (tp_entry) { 
    2267                 if (sel && sel->type == PJSIP_TPSELECTOR_LISTENER) { 
    2268                     transport *tp_iter = tp_entry; 
    2269                     do { 
     2308                transport *tp_iter = tp_entry; 
     2309                do { 
     2310                    /* Don't use transport being shutdown */ 
     2311                    if (!tp_iter->tp->is_shutdown) { 
    22702312                        if (sel && sel->type == PJSIP_TPSELECTOR_LISTENER && 
    2271                             sel->u.listener && 
    2272                             tp_iter->tp->factory == sel->u.listener) 
     2313                            sel->u.listener) 
    22732314                        { 
     2315                            /* Match listener if selector is set */ 
     2316                            if (tp_iter->tp->factory == sel->u.listener) { 
     2317                                tp_ref = tp_iter->tp; 
     2318                                break; 
     2319                            } 
     2320                        } else { 
    22742321                            tp_ref = tp_iter->tp; 
    22752322                            break; 
    22762323                        } 
    2277                         tp_iter = tp_iter->next; 
    2278                     } while (tp_iter != tp_entry); 
    2279                 } else { 
    2280                     tp_ref = tp_entry->tp; 
    2281                 } 
     2324                    } 
     2325                    tp_iter = tp_iter->next; 
     2326                } while (tp_iter != tp_entry); 
    22822327            } 
    22832328        } 
     
    22922337            /* Ignore address for loop transports. */ 
    22932338            if (type == PJSIP_TRANSPORT_LOOP || 
    2294                      type == PJSIP_TRANSPORT_LOOP_DGRAM) 
     2339                type == PJSIP_TRANSPORT_LOOP_DGRAM) 
    22952340            { 
    22962341                pj_sockaddr *addr = &key.rem_addr; 
     
    23312376             * but different factory). 
    23322377             */ 
     2378            TRACE_((THIS_FILE, "Transport found but from different listener")); 
    23332379        } 
    23342380 
     
    23632409 
    23642410            /* Verify that the listener type matches the destination type */ 
     2411            /* Already checked above. */ 
     2412            /* 
    23652413            if (sel->u.listener->type != type) { 
    23662414                pj_lock_release(mgr->lock); 
    23672415                return PJSIP_ETPNOTSUITABLE; 
    23682416            } 
     2417            */ 
    23692418 
    23702419            /* We'll use this listener to create transport */ 
Note: See TracChangeset for help on using the changeset viewer.