From 8e9a25ac02292bd74e9889800784e55f55fced25 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 21 Oct 2010 22:09:44 +0000 Subject: 2010-10-21 Joel Sherrill * psx05/init.c: Check for correct status returned. * psxrwlock01/psxrwlock01.scn, psxrwlock01/test.c: Add test code to exercise path when attempting to lock for reading but there is at least one writer blocked waiting for access. --- testsuites/psxtests/ChangeLog | 7 ++++ testsuites/psxtests/psx05/init.c | 4 +-- testsuites/psxtests/psxrwlock01/psxrwlock01.scn | 18 ++++++++-- testsuites/psxtests/psxrwlock01/test.c | 45 ++++++++++++++++++++++--- 4 files changed, 64 insertions(+), 10 deletions(-) (limited to 'testsuites') diff --git a/testsuites/psxtests/ChangeLog b/testsuites/psxtests/ChangeLog index 678be85245..f09ac1de62 100644 --- a/testsuites/psxtests/ChangeLog +++ b/testsuites/psxtests/ChangeLog @@ -1,3 +1,10 @@ +2010-10-21 Joel Sherrill + + * psx05/init.c: Check for correct status returned. + * psxrwlock01/psxrwlock01.scn, psxrwlock01/test.c: Add test code + to exercise path when attempting to lock for reading but there + is at least one writer blocked waiting for access. + 2010-10-21 Joel Sherrill * Makefile.am, configure.ac: New test to ensure pthread_cond_wait() and diff --git a/testsuites/psxtests/psx05/init.c b/testsuites/psxtests/psx05/init.c index 3f01b94e5a..70e2187828 100644 --- a/testsuites/psxtests/psx05/init.c +++ b/testsuites/psxtests/psx05/init.c @@ -430,9 +430,9 @@ void *POSIX_Init( calculate_abstimeout( ×, -1, (TOD_NANOSECONDS_PER_SECOND / 2) ); status = pthread_mutex_timedlock( &Mutex_id, × ); - if ( status != EBUSY ) + if ( status != ETIMEDOUT ) printf( "status = %d\n", status ); - rtems_test_assert( status == EBUSY ); + rtems_test_assert( status == ETIMEDOUT ); /* switch to idle */ diff --git a/testsuites/psxtests/psxrwlock01/psxrwlock01.scn b/testsuites/psxtests/psxrwlock01/psxrwlock01.scn index 578c5f54c7..fb315f35f2 100644 --- a/testsuites/psxtests/psxrwlock01/psxrwlock01.scn +++ b/testsuites/psxtests/psxrwlock01/psxrwlock01.scn @@ -60,6 +60,7 @@ pthread_rwlock_destroy( &RWLock ) -- EBUSY pthread_rwlock_unlock(RWLock) -- OK ReadThread - pthread_rwlock_rdlock(RWLock) unblocked -- OK ReadThread - pthread_rwlock_rdlock(RWLock) unblocked -- OK + pthread_rwlock_trywrlock(RWLock) -- OK pthread_rwlock_trywrlock(&RWLock) -- EBUSY Init: pthread_create - thread 1 OK @@ -70,16 +71,27 @@ pthread_rwlock_unlock(RWLock) -- OK WriteThread - pthread_rwlock_wrlock(RWLock) unblocked -- OK WriteThread - pthread_rwlock_unlock(RWLock) -- OK WriteThread - pthread_rwlock_wrlock(RWLock) unblocked -- OK +WriteThread - pthread_rwlock_unlock(RWLock) -- OK + +pthread_rwlock_tryrdlock(&RWLock) -- OK +Init: pthread_create - thread reader & writer OK +WriteThread - pthread_rwlock_wrlock(RWLock) blocking -- OK +ReadThread - pthread_rwlock_rdlock(RWLock) blocking -- OK +pthread_rwlock_tryrdlock(&RWLock) -- EBUSY +pthread_rwlock_trywrlock(&RWLock) -- EBUSY +pthread_rwlock_unlock(&RWLock) -- OK +WriteThread - pthread_rwlock_wrlock(RWLock) unblocked -- OK +WriteThread - pthread_rwlock_unlock(RWLock) -- OK +ReadThread - pthread_rwlock_rdlock(RWLock) unblocked -- OK clock_gettime(CLOCK_REALTIME, &abstime) -- OK pthread_rwlock_timedwrlock( &RWLock, &abstime) -- OK -WriteThread - pthread_rwlock_unlock(RWLock) -- OK pthread_rwlock_timedrdlock( &RWLock, &abstime) -- ETIMEDOUT pthread_rwlock_timedrdlock( &RWLock, &abstime) -- ETIMEDOUT pthread_rwlock_timedwrlock( &RWLock, &abstime) -- ETIMEDOUT pthread_rwlock_timedrdlock( &RWLock, &abstime) -- in past -- OK pthread_rwlock_timedwrlock( &RWLock, &abstime) -- in past -- OK pthread_rwlock_destroy( &RWLock ) -- OK -pthread_rwlock_init( &rwlock, NULL ) -- OK -pthread_rwlock_unlock ( &rwlock ) -- OK +pthread_rwlock_init( &rwlock, NULL ) -- OK +pthread_rwlock_unlock ( &rwlock ) -- OK pthread_rwlock_unlock ( &rwlock ) -- OK *** END OF POSIX RWLOCK TEST 01 *** diff --git a/testsuites/psxtests/psxrwlock01/test.c b/testsuites/psxtests/psxrwlock01/test.c index 433d8b2e36..83d0a0527d 100644 --- a/testsuites/psxtests/psxrwlock01/test.c +++ b/testsuites/psxtests/psxrwlock01/test.c @@ -1,7 +1,7 @@ /* * This test exercises the POSIX RWLock manager. * - * COPYRIGHT (c) 1989-2009. + * COPYRIGHT (c) 1989-2010. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -57,10 +57,12 @@ void *WriteLockThread(void *arg) rtems_test_assert( !status ); puts( "WriteThread - pthread_rwlock_wrlock(RWLock) unblocked -- OK" ); - sleep( 1 ); + sleep( 2 ); puts( "WriteThread - pthread_rwlock_unlock(RWLock) -- OK" ); status = pthread_rwlock_unlock(&RWLock); + if ( status ) + printf( "status=%s\n", strerror(status) ); rtems_test_assert( !status ); return NULL; } @@ -340,7 +342,7 @@ int main( sleep(2); /*************** CREATE THREADS AND LET THEM OBTAIN WRITE LOCK *************/ - puts( "pthread_rwlock_trywrlock(RWLock) -- OK" ); + puts( "\npthread_rwlock_trywrlock(RWLock) -- OK" ); status = pthread_rwlock_trywrlock(&RWLock); rtems_test_assert( !status ); @@ -354,14 +356,47 @@ int main( pthread_create(&ThreadIds[i], NULL, WriteLockThread, &ThreadIds[i]); rtems_test_assert( !status ); - sleep(1); + sleep(2); } puts( "pthread_rwlock_unlock(RWLock) -- OK" ); status = pthread_rwlock_unlock(&RWLock); rtems_test_assert( !status ); - sleep(2); + sleep(6); + + /*************** CREATE THREADS AND LET THEM OBTAIN WRITE LOCK *************/ + /*************** THEN ATTEMPT TO OBTAIN A READLOCK *************/ + + puts( "\npthread_rwlock_tryrdlock(&RWLock) -- OK" ); + status = pthread_rwlock_tryrdlock(&RWLock); + rtems_test_assert( !status ); + + printf( "Init: pthread_create - thread reader & writer OK\n" ); + status = pthread_create(&ThreadIds[0], NULL, WriteLockThread, &ThreadIds[0]); + rtems_test_assert( !status ); + + sleep(1); + status = pthread_create(&ThreadIds[1], NULL, ReadLockThread, &ThreadIds[1]); + rtems_test_assert( !status ); + + sleep(1); + + puts( "pthread_rwlock_tryrdlock(&RWLock) -- EBUSY" ); + status = pthread_rwlock_tryrdlock(&RWLock); + rtems_test_assert( status == EBUSY ); + + puts( "pthread_rwlock_trywrlock(&RWLock) -- EBUSY" ); + status = pthread_rwlock_trywrlock(&RWLock); + rtems_test_assert( status == EBUSY ); + + sleep( 5 ); + + puts( "pthread_rwlock_unlock(&RWLock) -- OK" ); + status = pthread_rwlock_unlock(&RWLock); + rtems_test_assert( !status ); + + sleep( 5 ); /*************** TIMEOUT ON RWLOCK ***************/ puts( "clock_gettime(CLOCK_REALTIME, &abstime) -- OK" ); -- cgit v1.2.3