Changeset 5758


Ignore:
Timestamp:
03/26/18 05:33:50 (6 months ago)
Author:
nanang
Message:

Close #2101:

  • set atomic's mutex to NULL in atomic destroy
  • added few sanity checks to the atomic functions.
Location:
pjproject/trunk/pjlib/src/pj
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/src/pj/os_core_unix.c

    r5277 r5758  
    880880PJ_DEF(pj_status_t) pj_atomic_destroy( pj_atomic_t *atomic_var ) 
    881881{ 
     882    pj_status_t status; 
     883 
    882884    PJ_ASSERT_RETURN(atomic_var, PJ_EINVAL); 
    883 #if PJ_HAS_THREADS 
    884     return pj_mutex_destroy( atomic_var->mutex ); 
     885     
     886#if PJ_HAS_THREADS 
     887    status = pj_mutex_destroy( atomic_var->mutex ); 
     888    if (status == PJ_SUCCESS) { 
     889        atomic_var->mutex = NULL; 
     890    } 
     891    return status; 
    885892#else 
    886893    return 0; 
     
    893900PJ_DEF(void) pj_atomic_set(pj_atomic_t *atomic_var, pj_atomic_value_t value) 
    894901{ 
     902    pj_status_t status; 
     903 
     904    PJ_CHECK_STACK(); 
     905    PJ_ASSERT_ON_FAIL(atomic_var, return); 
     906 
     907#if PJ_HAS_THREADS 
     908    status = pj_mutex_lock( atomic_var->mutex ); 
     909    if (status != PJ_SUCCESS) { 
     910        return; 
     911    } 
     912#endif 
     913    atomic_var->value = value; 
     914#if PJ_HAS_THREADS 
     915    pj_mutex_unlock( atomic_var->mutex); 
     916#endif 
     917} 
     918 
     919/* 
     920 * pj_atomic_get() 
     921 */ 
     922PJ_DEF(pj_atomic_value_t) pj_atomic_get(pj_atomic_t *atomic_var) 
     923{ 
     924    pj_atomic_value_t oldval; 
     925 
    895926    PJ_CHECK_STACK(); 
    896927 
     
    898929    pj_mutex_lock( atomic_var->mutex ); 
    899930#endif 
    900     atomic_var->value = value; 
     931    oldval = atomic_var->value; 
    901932#if PJ_HAS_THREADS 
    902933    pj_mutex_unlock( atomic_var->mutex); 
    903934#endif 
    904 } 
    905  
    906 /* 
    907  * pj_atomic_get() 
    908  */ 
    909 PJ_DEF(pj_atomic_value_t) pj_atomic_get(pj_atomic_t *atomic_var) 
    910 { 
    911     pj_atomic_value_t oldval; 
     935    return oldval; 
     936} 
     937 
     938/* 
     939 * pj_atomic_inc_and_get() 
     940 */ 
     941PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var) 
     942{ 
     943    pj_atomic_value_t new_value; 
    912944 
    913945    PJ_CHECK_STACK(); 
     
    916948    pj_mutex_lock( atomic_var->mutex ); 
    917949#endif 
    918     oldval = atomic_var->value; 
     950    new_value = ++atomic_var->value; 
    919951#if PJ_HAS_THREADS 
    920952    pj_mutex_unlock( atomic_var->mutex); 
    921953#endif 
    922     return oldval; 
    923 } 
    924  
    925 /* 
    926  * pj_atomic_inc_and_get() 
    927  */ 
    928 PJ_DEF(pj_atomic_value_t) pj_atomic_inc_and_get(pj_atomic_t *atomic_var) 
     954 
     955    return new_value; 
     956} 
     957/* 
     958 * pj_atomic_inc() 
     959 */ 
     960PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var) 
     961{ 
     962    PJ_ASSERT_ON_FAIL(atomic_var, return); 
     963    pj_atomic_inc_and_get(atomic_var); 
     964} 
     965 
     966/* 
     967 * pj_atomic_dec_and_get() 
     968 */ 
     969PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var) 
    929970{ 
    930971    pj_atomic_value_t new_value; 
     
    935976    pj_mutex_lock( atomic_var->mutex ); 
    936977#endif 
    937     new_value = ++atomic_var->value; 
     978    new_value = --atomic_var->value; 
    938979#if PJ_HAS_THREADS 
    939980    pj_mutex_unlock( atomic_var->mutex); 
     
    942983    return new_value; 
    943984} 
    944 /* 
    945  * pj_atomic_inc() 
    946  */ 
    947 PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var) 
    948 { 
    949     pj_atomic_inc_and_get(atomic_var); 
    950 } 
    951  
    952 /* 
    953  * pj_atomic_dec_and_get() 
    954  */ 
    955 PJ_DEF(pj_atomic_value_t) pj_atomic_dec_and_get(pj_atomic_t *atomic_var) 
    956 { 
    957     pj_atomic_value_t new_value; 
    958  
    959     PJ_CHECK_STACK(); 
    960  
    961 #if PJ_HAS_THREADS 
    962     pj_mutex_lock( atomic_var->mutex ); 
    963 #endif 
    964     new_value = --atomic_var->value; 
    965 #if PJ_HAS_THREADS 
    966     pj_mutex_unlock( atomic_var->mutex); 
    967 #endif 
    968  
    969     return new_value; 
    970 } 
    971985 
    972986/* 
     
    975989PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var) 
    976990{ 
     991    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    977992    pj_atomic_dec_and_get(atomic_var); 
    978993} 
     
    10061021                            pj_atomic_value_t value ) 
    10071022{ 
     1023    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    10081024    pj_atomic_add_and_get(atomic_var, value); 
    10091025} 
  • pjproject/trunk/pjlib/src/pj/os_core_win32.c

    r5539 r5758  
    751751{ 
    752752    PJ_CHECK_STACK(); 
     753    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    753754 
    754755    InterlockedExchange(&atomic_var->value, value); 
     
    785786PJ_DEF(void) pj_atomic_inc(pj_atomic_t *atomic_var) 
    786787{ 
     788    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    787789    pj_atomic_inc_and_get(atomic_var); 
    788790} 
     
    807809PJ_DEF(void) pj_atomic_dec(pj_atomic_t *atomic_var) 
    808810{ 
     811    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    809812    pj_atomic_dec_and_get(atomic_var); 
    810813} 
     
    816819                            pj_atomic_value_t value ) 
    817820{ 
     821    PJ_ASSERT_ON_FAIL(atomic_var, return); 
    818822#if defined(PJ_WIN32_WINNT) && PJ_WIN32_WINNT >= 0x0400 
    819823    InterlockedExchangeAdd( &atomic_var->value, value ); 
Note: See TracChangeset for help on using the changeset viewer.