c - pthread_rwlock_rdlock resulting in number of readers going as negative -


when can scenario happen?

one of threads stuck on write , other keeps calling read_lock resulting in negative readers increase. write attempts done same thread , reads thread.

the following lock definitions ->

typedef sp_rwlock_t pthread_rwlock_t;  int sp_rwlock_rlock(sp_rwlock_t *lock) {     int status;      if (lock->__data.__nr_readers  > 1) {         syslog(log_err,"%s:wierd readers :%d\n",__func__, lock->__data.__nr_readers);     }      if (lock) {         if ((status = pthread_rwlock_rdlock(lock)) == 0) {             return sp_ok;         } else {             syslog(log_err,"error in func: %s errno %x\n",__func__, status);             return sp_error;         }     } /* if lock */     return sp_invalid_arg; }  int sp_rwlock_wlock(sp_rwlock_t *lock) {     if (lock->__data.__nr_readers  > 0) {         syslog(log_err,"%s:wierd readers\n",__func__);     }      if (lock) {         if (pthread_rwlock_wrlock(lock) == 0) {             return sp_ok;         } else {             syslog(log_err,"error in func: %s errno %x\n",__func__, errno);             return sp_error;         }     } /* if lock */     return sp_invalid_arg; } 

following logs seen ->

sp_rwlock_rlock:wierd readers :-1

error in func: sp_rwlock_rlock errno b

sp_rwlock_rlock:wierd readers :-3

sp_rwlock_rlock:wierd readers :-4

sp_rwlock_wlock:wierd readers

sp_rwlock_rlock:wierd readers :-5

sp_rwlock_rlock:wierd readers :-6

sp_rwlock_rlock:wierd readers :-7

__nr_readers unsigned int - @ least in version of glibc - , printing %d signed ints. use %u format correctly.

the __nr_readers being decremented beyond 0 means you're unlocking lock more times you've locked - undefined behaviour.

(you shouldn't poking around in lock internals anyway - reading __nr_readers should have glibc low-level-lock protects rwlock internals held.)

if have 1 thread reading, there's no point in using rwlock anyway - might using plain mutex. benefit of rwlock can have multiple readers accessing data simultaneously.


Comments

Popular posts from this blog

yii2 - Yii 2 Running a Cron in the basic template -

asp.net - 'System.Web.HttpContext' does not contain a definition for 'GetOwinContext' Mystery -

mercurial graft feature, can it copy? -