summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorRogerz Zhang <[email protected]>2013-03-28 23:26:46 +0800
committerRogerz Zhang <[email protected]>2013-03-28 23:26:46 +0800
commite9cf10daed85d9e2866e43ed79cddfff66772f39 (patch)
tree77678f0e1561e02d897b1341ecf343ea055d799f /components
parent8e6a534fa3411d86ca61c1291fde39d0b893094e (diff)
add comments to help understanding pthread
Diffstat (limited to 'components')
-rw-r--r--components/pthreads/pthread.h6
-rw-r--r--components/pthreads/pthread_rwlock.c12
2 files changed, 13 insertions, 5 deletions
diff --git a/components/pthreads/pthread.h b/components/pthreads/pthread.h
index fa56219224..6a87c026f6 100644
--- a/components/pthreads/pthread.h
+++ b/components/pthreads/pthread.h
@@ -104,9 +104,9 @@ struct pthread_rwlock
pthread_cond_t rw_condreaders; /* for reader threads waiting */
pthread_cond_t rw_condwriters; /* for writer threads waiting */
- int rw_nwaitreaders; /* the number waiting */
- int rw_nwaitwriters; /* the number waiting */
- int rw_refcount;
+ int rw_nwaitreaders; /* the number of reader threads waiting */
+ int rw_nwaitwriters; /* the number of writer threads waiting */
+ int rw_refcount; /* 0: unlocked, -1: locked by writer, > 0 locked by n readers */
};
typedef struct pthread_rwlock pthread_rwlock_t;
diff --git a/components/pthreads/pthread_rwlock.c b/components/pthreads/pthread_rwlock.c
index 3db0ecc662..b694cb09ff 100644
--- a/components/pthreads/pthread_rwlock.c
+++ b/components/pthreads/pthread_rwlock.c
@@ -112,9 +112,11 @@ int pthread_rwlock_rdlock (pthread_rwlock_t *rwlock)
while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
{
rwlock->rw_nwaitreaders++;
+ /* rw_mutex will be released when waiting for rw_condreaders */
result = pthread_cond_wait(&rwlock->rw_condreaders, &rwlock->rw_mutex);
+ /* rw_mutex should have been taken again when returned from waiting */
rwlock->rw_nwaitreaders--;
- if (result != 0)
+ if (result != 0) /* wait error */
break;
}
@@ -160,7 +162,9 @@ int pthread_rwlock_timedrdlock (pthread_rwlock_t * rwlock, const struct timespec
while (rwlock->rw_refcount < 0 || rwlock->rw_nwaitwriters > 0)
{
rwlock->rw_nwaitreaders++;
+ /* rw_mutex will be released when waiting for rw_condreaders */
result = pthread_cond_timedwait(&rwlock->rw_condreaders, &rwlock->rw_mutex, abstime);
+ /* rw_mutex should have been taken again when returned from waiting */
rwlock->rw_nwaitreaders--;
if (result != 0)
break;
@@ -187,7 +191,9 @@ int pthread_rwlock_timedwrlock (pthread_rwlock_t *rwlock, const struct timespec
while (rwlock->rw_refcount != 0)
{
rwlock->rw_nwaitwriters++;
+ /* rw_mutex will be released when waiting for rw_condwriters */
result = pthread_cond_timedwait(&rwlock->rw_condwriters, &rwlock->rw_mutex, abstime);
+ /* rw_mutex should have been taken again when returned from waiting */
rwlock->rw_nwaitwriters--;
if (result != 0) break;
@@ -233,7 +239,7 @@ int pthread_rwlock_unlock (pthread_rwlock_t *rwlock)
if (rwlock->rw_refcount > 0)
rwlock->rw_refcount--; /* releasing a reader */
else if (rwlock->rw_refcount == -1)
- rwlock->rw_refcount = 0; /* releasing a reader */
+ rwlock->rw_refcount = 0; /* releasing a writer */
/* give preference to waiting writers over waiting readers */
if (rwlock->rw_nwaitwriters > 0)
@@ -264,7 +270,9 @@ int pthread_rwlock_wrlock (pthread_rwlock_t *rwlock)
while (rwlock->rw_refcount != 0)
{
rwlock->rw_nwaitwriters++;
+ /* rw_mutex will be released when waiting for rw_condwriters */
result = pthread_cond_wait(&rwlock->rw_condwriters, &rwlock->rw_mutex);
+ /* rw_mutex should have been taken again when returned from waiting */
rwlock->rw_nwaitwriters--;
if (result != 0) break;