summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2013-03-30 08:16:45 +0800
committerBernard Xiong <[email protected]>2013-03-30 08:16:45 +0800
commit512b6ee996ff059e68f02e46fdc8fe8c6f52507a (patch)
tree957ca19d2e00761178fdef3c6a84f8731f52d601
parent608074deafecc96c26e219548a74e73f1f594b6d (diff)
parent43f59ee2feb56ba599964e1d89fb9d33e57f32aa (diff)
Merge branch 'master' of https://github.com/RT-Thread/rt-thread
-rw-r--r--.gitignore1
-rw-r--r--components/pthreads/pthread.h6
-rw-r--r--components/pthreads/pthread_rwlock.c12
3 files changed, 14 insertions, 5 deletions
diff --git a/.gitignore b/.gitignore
index e37699b164..9e2a6e8fc5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@
*.idb
*.ilk
build
+*~
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;