Problem with function ethr_rwmutex_tryrlock

Rickard Green <>
Thu May 27 15:37:10 CEST 2010


> Hi list,
> 
> I think the fallback version of function ethr_rwmutex_tryrlock in
> erts/lib_src/common/ethread.c is not correct. This function should be
> similar with pthread_rwlock_tryrdlock. For pthread_rwlock_tryrdlock, the
> calling thread acquires the read lock if a writer does not hold the lock and
> there are no writers blocked on the lock. But as following code shows,
> ethr_rwmutex_tryrlock doesn't get the lock when there is no waiting writer,
> and acquires the lock when there are waiting writers. Am I right?
> 
>  ethr_rwmutex_tryrlock(ethr_rwmutex *rwmtx)
> {
>     int res;
> #if ETHR_XCHK
>     if (!rwmtx || rwmtx->initialized != ETHR_RWMUTEX_INITIALIZED) {
> ASSERT(0);
> return EINVAL;
>     }
> #endif
>     res = ethr_mutex_trylock__(&rwmtx->mtx);
>     if (res != 0)
> return res;
>     if (!rwmtx->waiting_writers) {
> res = ethr_mutex_unlock__(&rwmtx->mtx);
> if (res == 0)
>     return EBUSY;
> return res;
>     }
>     rwmtx->readers++;
>     return ethr_mutex_unlock__(&rwmtx->mtx);
> }
> 
> Best Regards,
> Jianrong Zhang
> 

Yes, you are right.

      if (!rwmtx->waiting_writers) {

should be

      if (rwmtx->waiting_writers) {

Thanks! It will be fixed in the upcomming release.

Regards,
Rickard

-- 
Rickard Green, Erlang/OTP, Ericsson AB.


More information about the erlang-bugs mailing list