Ignore:
Timestamp:
Jan 5, 2006 11:35:46 PM (18 years ago)
Author:
bennylp
Message:

Added loop transport to test transaction

File:
1 edited

Legend:

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

    r106 r107  
    863863struct pj_rwmutex_t 
    864864{ 
    865     pj_mutex_t *read_lock, *write_lock; 
    866     int reader_count; 
     865    pj_mutex_t *read_lock; 
     866    /* write_lock must use semaphore, because write_lock may be released 
     867     * by thread other than the thread that acquire the write_lock in the 
     868     * first place. 
     869     */ 
     870    pj_sem_t   *write_lock; 
     871    pj_int32_t  reader_count; 
    867872}; 
    868873 
     
    886891        return status; 
    887892 
    888     status = pj_mutex_create_recursive(pool, name, &rwmutex->write_lock); 
     893    status = pj_sem_create(pool, name, 1, 1, &rwmutex->write_lock); 
    889894    if (status != PJ_SUCCESS) { 
    890895        pj_mutex_destroy(rwmutex->read_lock); 
     
    908913 
    909914    status = pj_mutex_lock(mutex->read_lock); 
    910     if (status != PJ_SUCCESS) 
     915    if (status != PJ_SUCCESS) { 
     916        pj_assert(!"This pretty much is unexpected"); 
    911917        return status; 
     918    } 
    912919 
    913920    mutex->reader_count++; 
     921 
     922    pj_assert(mutex->reader_count < 0x7FFFFFF0L); 
     923 
    914924    if (mutex->reader_count == 1) 
    915         pj_mutex_lock(mutex->write_lock); 
     925        pj_sem_wait(mutex->write_lock); 
    916926 
    917927    status = pj_mutex_unlock(mutex->read_lock); 
     
    926936{ 
    927937    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
    928     return pj_mutex_lock(mutex->write_lock); 
     938    return pj_sem_wait(mutex->write_lock); 
    929939} 
    930940 
     
    940950 
    941951    status = pj_mutex_lock(mutex->read_lock); 
    942     if (status != PJ_SUCCESS) 
     952    if (status != PJ_SUCCESS) { 
     953        pj_assert(!"This pretty much is unexpected"); 
    943954        return status; 
     955    } 
    944956 
    945957    pj_assert(mutex->reader_count >= 1); 
     
    947959    --mutex->reader_count; 
    948960    if (mutex->reader_count == 0) 
    949         pj_mutex_unlock(mutex->write_lock); 
     961        pj_sem_post(mutex->write_lock); 
    950962 
    951963    status = pj_mutex_unlock(mutex->read_lock); 
     
    960972{ 
    961973    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
    962     return pj_mutex_unlock(mutex->write_lock); 
     974    pj_assert(mutex->reader_count <= 1); 
     975    return pj_sem_post(mutex->write_lock); 
    963976} 
    964977 
     
    972985    PJ_ASSERT_RETURN(mutex, PJ_EINVAL); 
    973986    pj_mutex_destroy(mutex->read_lock); 
    974     pj_mutex_destroy(mutex->write_lock); 
     987    pj_sem_destroy(mutex->write_lock); 
    975988    return PJ_SUCCESS; 
    976989} 
Note: See TracChangeset for help on using the changeset viewer.