Changeset 5964


Ignore:
Timestamp:
Apr 8, 2019 1:24:10 AM (10 months ago)
Author:
riza
Message:

Misc (re #2147): Add lock to prevent race condition when accessing media list.
Thanks to Niclas Larsson for the report.

Location:
pjproject/trunk/pjsip
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsua2/endpoint.hpp

    r5923 r5964  
    16201620    std::map<pj_thread_t*, pj_thread_desc*> threadDescMap; 
    16211621    pj_mutex_t                  *threadDescMutex; 
     1622    pj_mutex_t                  *mediaListMutex; 
    16221623 
    16231624    /* Pending logging */ 
  • pjproject/trunk/pjsip/src/pjsua2/endpoint.cpp

    r5928 r5964  
    480480 */ 
    481481Endpoint::Endpoint() 
    482 : writer(NULL), threadDescMutex(NULL), mainThreadOnly(false),  
    483   mainThread(NULL), pendingJobSize(0) 
     482: writer(NULL), threadDescMutex(NULL), mediaListMutex(NULL),  
     483  mainThreadOnly(false), mainThread(NULL), pendingJobSize(0) 
    484484{ 
    485485    if (instance_) { 
     
    17131713    PJSUA2_CHECK_EXPR( pj_mutex_create_simple(pjsua_var.pool, "threadDesc", 
    17141714                                              &threadDescMutex) ); 
     1715 
     1716    PJSUA2_CHECK_EXPR( pj_mutex_create_recursive(pjsua_var.pool, "mediaList", 
     1717                                                 &mediaListMutex) ); 
    17151718} 
    17161719 
     
    17801783    } 
    17811784 
     1785    if (mediaListMutex) { 
     1786        pj_mutex_destroy(mediaListMutex); 
     1787        mediaListMutex = NULL; 
     1788    } 
     1789 
    17821790    status = pjsua_destroy2(flags); 
    17831791 
     
    20392047void Endpoint::mediaAdd(AudioMedia &media) 
    20402048{ 
    2041     if (mediaExists(media)) 
    2042         return; 
     2049    pj_mutex_lock(mediaListMutex); 
     2050 
     2051    if (mediaExists(media)) { 
     2052        pj_mutex_unlock(mediaListMutex); 
     2053        return; 
     2054    } 
    20432055 
    20442056    mediaList.push_back(&media); 
     2057    pj_mutex_unlock(mediaListMutex); 
    20452058} 
    20462059 
    20472060void Endpoint::mediaRemove(AudioMedia &media) 
    20482061{ 
     2062    pj_mutex_lock(mediaListMutex); 
    20492063    AudioMediaVector::iterator it = std::find(mediaList.begin(), 
    20502064                                              mediaList.end(), 
     
    20542068        mediaList.erase(it); 
    20552069 
     2070    pj_mutex_unlock(mediaListMutex); 
    20562071} 
    20572072 
    20582073bool Endpoint::mediaExists(const AudioMedia &media) const 
    20592074{ 
     2075    bool exists; 
     2076 
     2077    pj_mutex_lock(mediaListMutex); 
    20602078    AudioMediaVector::const_iterator it = std::find(mediaList.begin(), 
    20612079                                                    mediaList.end(), 
    20622080                                                    &media); 
    2063  
    2064     return (it != mediaList.end()); 
     2081    exists = (it != mediaList.end()); 
     2082    pj_mutex_unlock(mediaListMutex); 
     2083    return exists; 
    20652084} 
    20662085 
Note: See TracChangeset for help on using the changeset viewer.