Ignore:
Timestamp:
Dec 30, 2005 11:50:15 PM (18 years ago)
Author:
bennylp
Message:

Basic module, transport, and sending messages

File:
1 edited

Legend:

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

    r70 r106  
    860860 
    861861/////////////////////////////////////////////////////////////////////////////// 
     862 
     863struct pj_rwmutex_t 
     864{ 
     865    pj_mutex_t *read_lock, *write_lock; 
     866    int reader_count; 
     867}; 
     868 
     869/* 
     870 * Create reader/writer mutex. 
     871 * 
     872 */ 
     873PJ_DEF(pj_status_t) pj_rwmutex_create(pj_pool_t *pool, const char *name, 
     874                                      pj_rwmutex_t **p_mutex) 
     875{ 
     876    pj_status_t status; 
     877    pj_rwmutex_t *rwmutex; 
     878 
     879    PJ_ASSERT_RETURN(pool && p_mutex, PJ_EINVAL); 
     880 
     881    *p_mutex = NULL; 
     882    rwmutex = pj_pool_alloc(pool, sizeof(struct pj_rwmutex_t)); 
     883 
     884    status = pj_mutex_create_simple(pool, name, &rwmutex ->read_lock); 
     885    if (status != PJ_SUCCESS) 
     886        return status; 
     887 
     888    status = pj_mutex_create_recursive(pool, name, &rwmutex->write_lock); 
     889    if (status != PJ_SUCCESS) { 
     890        pj_mutex_destroy(rwmutex->read_lock); 
     891        return status; 
     892    } 
     893 
     894    rwmutex->reader_count = 0; 
     895    *p_mutex = rwmutex; 
     896    return PJ_SUCCESS; 
     897} 
     898 
     899/* 
     900 * Lock the mutex for reading. 
     901 * 
     902 */ 
     903PJ_DEF(pj_status_t) pj_rwmutex_lock_read(pj_rwmutex_t *mutex) 
     904{ 
     905    pj_status_t status; 
     906 
     907    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
     908 
     909    status = pj_mutex_lock(mutex->read_lock); 
     910    if (status != PJ_SUCCESS) 
     911        return status; 
     912 
     913    mutex->reader_count++; 
     914    if (mutex->reader_count == 1) 
     915        pj_mutex_lock(mutex->write_lock); 
     916 
     917    status = pj_mutex_unlock(mutex->read_lock); 
     918    return status; 
     919} 
     920 
     921/* 
     922 * Lock the mutex for writing. 
     923 * 
     924 */ 
     925PJ_DEF(pj_status_t) pj_rwmutex_lock_write(pj_rwmutex_t *mutex) 
     926{ 
     927    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
     928    return pj_mutex_lock(mutex->write_lock); 
     929} 
     930 
     931/* 
     932 * Release read lock. 
     933 * 
     934 */ 
     935PJ_DEF(pj_status_t) pj_rwmutex_unlock_read(pj_rwmutex_t *mutex) 
     936{ 
     937    pj_status_t status; 
     938 
     939    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
     940 
     941    status = pj_mutex_lock(mutex->read_lock); 
     942    if (status != PJ_SUCCESS) 
     943        return status; 
     944 
     945    pj_assert(mutex->reader_count >= 1); 
     946 
     947    --mutex->reader_count; 
     948    if (mutex->reader_count == 0) 
     949        pj_mutex_unlock(mutex->write_lock); 
     950 
     951    status = pj_mutex_unlock(mutex->read_lock); 
     952    return status; 
     953} 
     954 
     955/* 
     956 * Release write lock. 
     957 * 
     958 */ 
     959PJ_DEF(pj_status_t) pj_rwmutex_unlock_write(pj_rwmutex_t *mutex) 
     960{ 
     961    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
     962    return pj_mutex_unlock(mutex->write_lock); 
     963} 
     964 
     965 
     966/* 
     967 * Destroy reader/writer mutex. 
     968 * 
     969 */ 
     970PJ_DEF(pj_status_t) pj_rwmutex_destroy(pj_rwmutex_t *mutex) 
     971{ 
     972    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
     973    pj_mutex_destroy(mutex->read_lock); 
     974    pj_mutex_destroy(mutex->write_lock); 
     975    return PJ_SUCCESS; 
     976} 
     977 
     978/////////////////////////////////////////////////////////////////////////////// 
    862979/* 
    863980 * pj_enter_critical_section() 
Note: See TracChangeset for help on using the changeset viewer.