diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-22 08:22:11 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-22 08:24:57 +0200 |
commit | bdc468a9c52ff89ff79fab84a1cbc6bfa8c872ca (patch) | |
tree | 16d6291332adc6c68f4f7dc0b093c98ad55a6e41 | |
parent | psxrdwrv/test.c: Clear iovec to ensure consistent results (diff) | |
download | rtems-bdc468a9c52ff89ff79fab84a1cbc6bfa8c872ca.tar.bz2 |
posix: Allow PTHREAD_PROCESS_SHARED for rwlocks
Close #3153.
-rw-r--r-- | cpukit/posix/src/prwlockinit.c | 30 | ||||
-rw-r--r-- | testsuites/psxtests/psxrwlock01/test.c | 38 |
2 files changed, 45 insertions, 23 deletions
diff --git a/cpukit/posix/src/prwlockinit.c b/cpukit/posix/src/prwlockinit.c index 34ab1aeff1..ffce8149a9 100644 --- a/cpukit/posix/src/prwlockinit.c +++ b/cpukit/posix/src/prwlockinit.c @@ -58,9 +58,7 @@ int pthread_rwlock_init( const pthread_rwlockattr_t *attr ) { - POSIX_RWLock_Control *the_rwlock; - pthread_rwlockattr_t default_attr; - const pthread_rwlockattr_t *the_attr; + POSIX_RWLock_Control *the_rwlock; /* * Error check parameters @@ -68,28 +66,14 @@ int pthread_rwlock_init( if ( !rwlock ) return EINVAL; - /* - * If the user passed in NULL, use the default attributes - */ - if ( attr ) { - the_attr = attr; - } else { - (void) pthread_rwlockattr_init( &default_attr ); - the_attr = &default_attr; - } - - /* - * Now start error checking the attributes that we are going to use - */ - if ( !the_attr->is_initialized ) - return EINVAL; + if ( attr != NULL ) { + if ( !attr->is_initialized ) { + return EINVAL; + } - switch ( the_attr->process_shared ) { - case PTHREAD_PROCESS_PRIVATE: /* only supported values */ - break; - case PTHREAD_PROCESS_SHARED: - default: + if ( !_POSIX_Is_valid_pshared( attr->process_shared ) ) { return EINVAL; + } } the_rwlock = _POSIX_RWLock_Allocate(); diff --git a/testsuites/psxtests/psxrwlock01/test.c b/testsuites/psxtests/psxrwlock01/test.c index e201293328..268f581a3e 100644 --- a/testsuites/psxtests/psxrwlock01/test.c +++ b/testsuites/psxtests/psxrwlock01/test.c @@ -90,6 +90,42 @@ void *WriteLockThread(void *arg) return NULL; } +static void test_pshared_init(void) +{ + pthread_rwlock_t rwlock; + pthread_rwlockattr_t attr; + int eno; + + eno = pthread_rwlockattr_init(&attr); + rtems_test_assert(eno == 0); + + eno = pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE); + rtems_test_assert(eno == 0); + + eno = pthread_rwlock_init(&rwlock, &attr); + rtems_test_assert(eno == 0); + + eno = pthread_rwlock_destroy(&rwlock); + rtems_test_assert(eno == 0); + + eno = pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + rtems_test_assert(eno == 0); + + eno = pthread_rwlock_init(&rwlock, &attr); + rtems_test_assert(eno == 0); + + eno = pthread_rwlock_destroy(&rwlock); + rtems_test_assert(eno == 0); + + attr.process_shared = -1; + + eno = pthread_rwlock_init(&rwlock, &attr); + rtems_test_assert(eno == EINVAL); + + eno = pthread_rwlockattr_destroy(&attr); + rtems_test_assert(eno == 0); +} + /* * main entry point to the test */ @@ -113,6 +149,8 @@ int main( TEST_BEGIN(); + test_pshared_init(); + /*************** NULL POINTER CHECKS *****************/ puts( "pthread_rwlockattr_init( NULL ) -- EINVAL" ); status = pthread_rwlockattr_init( NULL ); |