Ignore:
Timestamp:
Apr 15, 2019 10:52:16 AM (6 years ago)
Author:
nanang
Message:

Close #2189: fixed PJSUA2 thread safety issue in list of objects manipulation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua2/endpoint.cpp

    r5964 r5969  
    978978void Endpoint::on_buddy_state(pjsua_buddy_id buddy_id) 
    979979{ 
    980     Buddy *buddy = (Buddy*)pjsua_buddy_get_user_data(buddy_id); 
     980    Buddy b(buddy_id); 
     981    Buddy *buddy = b.getOriginalInstance(); 
    981982    if (!buddy || !buddy->isValid()) { 
    982983        /* Ignored */ 
     
    993994    PJ_UNUSED_ARG(sub); 
    994995 
    995     Buddy *buddy = (Buddy*)pjsua_buddy_get_user_data(buddy_id); 
     996    Buddy b(buddy_id); 
     997    Buddy *buddy = b.getOriginalInstance(); 
    996998    if (!buddy || !buddy->isValid()) { 
    997999        /* Ignored */ 
     
    20452047} 
    20462048 
     2049AudioMediaVector2 Endpoint::mediaEnumPorts2() const throw(Error) 
     2050{ 
     2051    AudioMediaVector2 amv2; 
     2052    pjsua_conf_port_id ids[PJSUA_MAX_CONF_PORTS]; 
     2053    unsigned i, count = PJSUA_MAX_CONF_PORTS; 
     2054 
     2055    PJSUA2_CHECK_EXPR( pjsua_enum_conf_ports(ids, &count) ); 
     2056    for (i = 0; i < count; ++i) { 
     2057        AudioMedia am; 
     2058        am.id = ids[i]; 
     2059        amv2.push_back(am); 
     2060    } 
     2061 
     2062    return amv2; 
     2063} 
     2064 
    20472065void Endpoint::mediaAdd(AudioMedia &media) 
    20482066{ 
     2067    /* mediaList serves mediaEnumPorts() only, once mediaEnumPorts() 
     2068     * is removed, this function implementation should be no-op. 
     2069     */ 
    20492070    pj_mutex_lock(mediaListMutex); 
    20502071 
     
    20602081void Endpoint::mediaRemove(AudioMedia &media) 
    20612082{ 
     2083    /* mediaList serves mediaEnumPorts() only, once mediaEnumPorts() 
     2084     * is removed, this function implementation should be no-op. 
     2085     */ 
    20622086    pj_mutex_lock(mediaListMutex); 
    20632087    AudioMediaVector::iterator it = std::find(mediaList.begin(), 
     
    20672091    if (it != mediaList.end()) 
    20682092        mediaList.erase(it); 
    2069  
    20702093    pj_mutex_unlock(mediaListMutex); 
    20712094} 
     
    20732096bool Endpoint::mediaExists(const AudioMedia &media) const 
    20742097{ 
    2075     bool exists; 
    2076  
    2077     pj_mutex_lock(mediaListMutex); 
    2078     AudioMediaVector::const_iterator it = std::find(mediaList.begin(), 
    2079                                                     mediaList.end(), 
    2080                                                     &media); 
    2081     exists = (it != mediaList.end()); 
    2082     pj_mutex_unlock(mediaListMutex); 
    2083     return exists; 
     2098    pjsua_conf_port_id id = media.getPortId(); 
     2099    if (id == PJSUA_INVALID_ID || id >= (int)mediaMaxPorts()) 
     2100        return false; 
     2101 
     2102    pjsua_conf_port_info pi; 
     2103    return (pjsua_conf_get_port_info(id, &pi) == PJ_SUCCESS); 
    20842104} 
    20852105 
     
    21082128} 
    21092129 
     2130CodecInfoVector2 Endpoint::codecEnum2() const throw(Error) 
     2131{ 
     2132    CodecInfoVector2 civ2; 
     2133    pjsua_codec_info pj_codec[MAX_CODEC_NUM]; 
     2134    unsigned count = MAX_CODEC_NUM; 
     2135 
     2136    PJSUA2_CHECK_EXPR( pjsua_enum_codecs(pj_codec, &count) ); 
     2137    for (unsigned i = 0; i<count; ++i) { 
     2138        CodecInfo codec_info; 
     2139        codec_info.fromPj(pj_codec[i]); 
     2140        civ2.push_back(codec_info); 
     2141    } 
     2142    return civ2; 
     2143} 
     2144 
    21102145void Endpoint::codecSetPriority(const string &codec_id, 
    21112146                                pj_uint8_t priority) throw(Error) 
     
    21692204#endif 
    21702205    return videoCodecInfoList; 
     2206} 
     2207 
     2208CodecInfoVector2 Endpoint::videoCodecEnum2() const throw(Error) 
     2209{ 
     2210    CodecInfoVector2 civ2; 
     2211#if PJSUA_HAS_VIDEO 
     2212    pjsua_codec_info pj_codec[MAX_CODEC_NUM]; 
     2213    unsigned count = MAX_CODEC_NUM; 
     2214 
     2215    PJSUA2_CHECK_EXPR(pjsua_vid_enum_codecs(pj_codec, &count)); 
     2216    for (unsigned i = 0; i<count; ++i) { 
     2217        CodecInfo codec_info; 
     2218        codec_info.fromPj(pj_codec[i]); 
     2219        civ2.push_back(codec_info); 
     2220    } 
     2221#endif 
     2222    return civ2; 
    21712223} 
    21722224 
Note: See TracChangeset for help on using the changeset viewer.