diff options
author | Glenn Humphrey <glenn.humphrey@oarcorp.com> | 2007-11-27 18:38:18 +0000 |
---|---|---|
committer | Glenn Humphrey <glenn.humphrey@oarcorp.com> | 2007-11-27 18:38:18 +0000 |
commit | 1d56a7a8b8a0b48fdeb02f6d4408a8236e8ccf95 (patch) | |
tree | f7b57219ee7fc61ccc9d0fa6023d556e954eefdb /cpukit/score/src | |
parent | 2007-11-27 Glenn Humphrey <glenn.humphrey@OARcorp.com> (diff) | |
download | rtems-1d56a7a8b8a0b48fdeb02f6d4408a8236e8ccf95.tar.bz2 |
2007-11-27 Glenn Humphrey <glenn.humphrey@OARcorp.com>
* posix/src/prwlocktimedrdlock.c, posix/src/prwlocktimedwrlock.c,
rtems/include/rtems/rtems/barrier.h,
score/src/corerwlockobtainread.c, score/src/corerwlockobtainwrite.c,
score/src/corerwlockrelease.c: Fixed several implementation errors.
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/corerwlockobtainread.c | 1 | ||||
-rw-r--r-- | cpukit/score/src/corerwlockobtainwrite.c | 1 | ||||
-rw-r--r-- | cpukit/score/src/corerwlockrelease.c | 47 |
3 files changed, 24 insertions, 25 deletions
diff --git a/cpukit/score/src/corerwlockobtainread.c b/cpukit/score/src/corerwlockobtainread.c index 724529eef5..21429a5658 100644 --- a/cpukit/score/src/corerwlockobtainread.c +++ b/cpukit/score/src/corerwlockobtainread.c @@ -84,6 +84,7 @@ void _CORE_RWLock_Obtain_for_reading( if ( !wait ) { _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; + return; } /* diff --git a/cpukit/score/src/corerwlockobtainwrite.c b/cpukit/score/src/corerwlockobtainwrite.c index a1535b786f..2d1ff2aa3a 100644 --- a/cpukit/score/src/corerwlockobtainwrite.c +++ b/cpukit/score/src/corerwlockobtainwrite.c @@ -74,6 +74,7 @@ void _CORE_RWLock_Obtain_for_writing( if ( !wait ) { _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; + return; } /* diff --git a/cpukit/score/src/corerwlockrelease.c b/cpukit/score/src/corerwlockrelease.c index b9d0e2f9e1..4d29cd0f21 100644 --- a/cpukit/score/src/corerwlockrelease.c +++ b/cpukit/score/src/corerwlockrelease.c @@ -40,7 +40,6 @@ CORE_RWLock_Status _CORE_RWLock_Release( ISR_Level level; Thread_Control *executing = _Thread_Executing; Thread_Control *next; - uint32_t rwmode; /* * If unlocked, then OK to read. @@ -80,32 +79,30 @@ CORE_RWLock_Status _CORE_RWLock_Release( next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); if ( next ) { - rwmode = next->Wait.option; - if ( rwmode == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { - the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; - return CORE_RWLOCK_SUCCESSFUL; - } - - /* - * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING now see if more - * readers can be let go. - */ - - while ( 1 ) { - next = _Thread_queue_First( &the_rwlock->Wait_queue ); - if ( !next ) - return CORE_RWLOCK_SUCCESSFUL; - if ( next->Wait.option != CORE_RWLOCK_THREAD_WAITING_FOR_READ ) - return CORE_RWLOCK_SUCCESSFUL; - - /* it is definitely wanting to read */ - the_rwlock->number_of_readers += 1; - _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); - } + if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { + the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; + return CORE_RWLOCK_SUCCESSFUL; + } - /* XXX need to put read/write lock request indicator in Wait info */ + /* + * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING + */ + the_rwlock->number_of_readers += 1; + the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; - } + /* + * Now see if more readers can be let go. + */ + while ( 1 ) { + next = _Thread_queue_First( &the_rwlock->Wait_queue ); + if ( !next || + next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) + return CORE_RWLOCK_SUCCESSFUL; + the_rwlock->number_of_readers += 1; + _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); + } + } + /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } |