summaryrefslogtreecommitdiffstats
path: root/testsuites/psxtests
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-09-21 15:42:45 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-10-05 14:29:02 +0200
commit89fc9345dea5c675f8d93546fa3c723918d3279a (patch)
tree89c32d64f375e1a9bf9d3725b1256aeb7ca46221 /testsuites/psxtests
parentposix: Implement self-contained POSIX barriers (diff)
downloadrtems-89fc9345dea5c675f8d93546fa3c723918d3279a.tar.bz2
posix: Implement self-contained POSIX rwlocks
POSIX rwlocks are now available in all configurations and no longer depend on --enable-posix. Update #2514. Update #3115.
Diffstat (limited to 'testsuites/psxtests')
-rw-r--r--testsuites/psxtests/psxconfig01/init.c13
-rw-r--r--testsuites/psxtests/psxrwlock01/main.c1
-rw-r--r--testsuites/psxtests/psxrwlock01/psxrwlock01.scn5
-rw-r--r--testsuites/psxtests/psxrwlock01/test.c255
4 files changed, 203 insertions, 71 deletions
diff --git a/testsuites/psxtests/psxconfig01/init.c b/testsuites/psxtests/psxconfig01/init.c
index c9e6bfd9fb..154b4d1bd6 100644
--- a/testsuites/psxtests/psxconfig01/init.c
+++ b/testsuites/psxtests/psxconfig01/init.c
@@ -64,7 +64,6 @@ const char rtems_test_name[] = "PSXCONFIG 1";
#define POSIX_MQ_COUNT 5
#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 19
#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 7
-#define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 31
#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 41
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
@@ -474,18 +473,6 @@ static rtems_task Init(rtems_task_argument argument)
);
#endif
-#ifdef CONFIGURE_MAXIMUM_POSIX_RWLOCKS
- for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_RWLOCKS; ++i) {
- pthread_rwlock_t rwlock;
- eno = pthread_rwlock_init(&rwlock, NULL);
- rtems_test_assert(eno == 0);
- }
- rtems_resource_snapshot_take(&snapshot);
- rtems_test_assert(
- snapshot.posix_api.active_rwlocks == CONFIGURE_MAXIMUM_POSIX_RWLOCKS
- );
-#endif
-
#ifdef CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_SEMAPHORES; ++i) {
int oflag = O_RDWR | O_CREAT | O_EXCL;
diff --git a/testsuites/psxtests/psxrwlock01/main.c b/testsuites/psxtests/psxrwlock01/main.c
index 3719b326f9..88190ebb2a 100644
--- a/testsuites/psxtests/psxrwlock01/main.c
+++ b/testsuites/psxtests/psxrwlock01/main.c
@@ -39,7 +39,6 @@ rtems_task Init(
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
-#define CONFIGURE_MAXIMUM_POSIX_RWLOCKS 1
#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
diff --git a/testsuites/psxtests/psxrwlock01/psxrwlock01.scn b/testsuites/psxtests/psxrwlock01/psxrwlock01.scn
index fb315f35f2..fe47b19bea 100644
--- a/testsuites/psxtests/psxrwlock01/psxrwlock01.scn
+++ b/testsuites/psxtests/psxrwlock01/psxrwlock01.scn
@@ -1,4 +1,4 @@
-*** POSIX RWLOCK TEST 01 ***
+*** BEGIN OF TEST PSXRWLOCK 1 ***
pthread_rwlockattr_init( NULL ) -- EINVAL
pthread_rwlockattr_setpshared( NULL, private ) -- EINVAL
pthread_rwlockattr_setpshared( NULL, shared ) -- EINVAL
@@ -37,7 +37,6 @@ pthread_rwlock_trywrlock(BadId) -- EINVAL
pthread_rwlock_unlock(BadId) -- EINVAL
pthread_rwlockattr_init( &attr ) -- OK
pthread_rwlock_init( &rwlock, &attr ) -- OK
-pthread_rwlock_init( &rwlock, &attr ) -- EAGAIN
pthread_rwlock_destroy( &rwlock ) -- OK
pthread_rwlock_init( &rwlock, NULL ) -- OK
pthread_rwlock_destroy( &rwlock ) -- OK
@@ -94,4 +93,4 @@ pthread_rwlock_destroy( &RWLock ) -- OK
pthread_rwlock_init( &rwlock, NULL ) -- OK
pthread_rwlock_unlock ( &rwlock ) -- OK
pthread_rwlock_unlock ( &rwlock ) -- OK
-*** END OF POSIX RWLOCK TEST 01 ***
+*** END OF TEST PSXRWLOCK 1 ***
diff --git a/testsuites/psxtests/psxrwlock01/test.c b/testsuites/psxtests/psxrwlock01/test.c
index 268f581a3e..6c85c03893 100644
--- a/testsuites/psxtests/psxrwlock01/test.c
+++ b/testsuites/psxtests/psxrwlock01/test.c
@@ -90,7 +90,7 @@ void *WriteLockThread(void *arg)
return NULL;
}
-static void test_pshared_init(void)
+static void test_rwlock_pshared_init(void)
{
pthread_rwlock_t rwlock;
pthread_rwlockattr_t attr;
@@ -126,6 +126,193 @@ static void test_pshared_init(void)
rtems_test_assert(eno == 0);
}
+static void test_rwlock_null( void )
+{
+ struct timespec to;
+ int eno;
+
+ eno = pthread_rwlock_destroy( NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_init( NULL, NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_rdlock( NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedrdlock( NULL, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedwrlock( NULL, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_tryrdlock( NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_trywrlock( NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_unlock( NULL );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_wrlock( NULL );
+ rtems_test_assert( eno == EINVAL );
+}
+
+static void test_rwlock_not_initialized( void )
+{
+ pthread_rwlock_t rw;
+ struct timespec to;
+ int eno;
+
+ memset( &rw, 0xff, sizeof( rw ) );
+
+ eno = pthread_rwlock_destroy( &rw );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_rdlock( &rw );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedrdlock( &rw, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedwrlock( &rw, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_tryrdlock( &rw );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_trywrlock( &rw );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_unlock( &rw );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_wrlock( &rw );
+ rtems_test_assert( eno == EINVAL );
+}
+
+static void test_rwlock_invalid_copy( void )
+{
+ pthread_rwlock_t rw;
+ pthread_rwlock_t rw2;
+ struct timespec to;
+ int eno;
+
+ eno = pthread_rwlock_init( &rw, NULL );
+ rtems_test_assert( eno == 0 );
+
+ memcpy( &rw2, &rw, sizeof( rw2 ) );
+
+ eno = pthread_rwlock_destroy( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_rdlock( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedrdlock( &rw2, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedwrlock( &rw2, &to );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_tryrdlock( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_trywrlock( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_unlock( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_wrlock( &rw2 );
+ rtems_test_assert( eno == EINVAL );
+
+ eno = pthread_rwlock_destroy( &rw );
+ rtems_test_assert( eno == 0 );
+}
+
+static void test_rwlock_auto_initialization( void )
+{
+ struct timespec to;
+ int eno;
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_destroy( &rw );
+ rtems_test_assert( eno == 0 );
+
+ eno = pthread_rwlock_destroy( &rw );
+ rtems_test_assert( eno == EINVAL );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_rdlock( &rw );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedrdlock( &rw, &to );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ to.tv_sec = 1;
+ to.tv_nsec = 1;
+ eno = pthread_rwlock_timedwrlock( &rw, &to );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_tryrdlock( &rw );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_trywrlock( &rw );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_unlock( &rw );
+ rtems_test_assert( eno == 0 );
+ }
+
+ {
+ static pthread_rwlock_t rw = PTHREAD_RWLOCK_INITIALIZER;
+
+ eno = pthread_rwlock_wrlock( &rw );
+ rtems_test_assert( eno == 0 );
+ }
+}
+
/*
* main entry point to the test
*/
@@ -140,7 +327,6 @@ int main(
#endif
{
pthread_rwlock_t rwlock;
- pthread_rwlock_t rwlock2;
pthread_rwlockattr_t attr;
int status;
int p;
@@ -149,7 +335,11 @@ int main(
TEST_BEGIN();
- test_pshared_init();
+ test_rwlock_pshared_init();
+ test_rwlock_null();
+ test_rwlock_not_initialized();
+ test_rwlock_invalid_copy();
+ test_rwlock_auto_initialization();
/*************** NULL POINTER CHECKS *****************/
puts( "pthread_rwlockattr_init( NULL ) -- EINVAL" );
@@ -192,42 +382,6 @@ int main(
status = pthread_rwlockattr_setpshared( &attr, ~PTHREAD_PROCESS_PRIVATE );
rtems_test_assert( status == EINVAL );
- /*************** AUTO INITIALIZATION *****************/
-
- rwlock = PTHREAD_RWLOCK_INITIALIZER;
- rwlock2 = PTHREAD_RWLOCK_INITIALIZER;
-
- status = pthread_rwlock_rdlock( &rwlock );
- rtems_test_assert( status == 0 );
-
- status = pthread_rwlock_rdlock( &rwlock2 );
- rtems_test_assert( status == EINVAL );
-
- status = pthread_rwlock_destroy( &rwlock );
- rtems_test_assert( status == 0 );
-
- status = pthread_rwlock_rdlock( &rwlock2 );
- rtems_test_assert( status == 0 );
-
- status = pthread_rwlock_destroy( &rwlock );
- rtems_test_assert( status == 0 );
-
- rwlock = PTHREAD_RWLOCK_INITIALIZER;
- rwlock2 = PTHREAD_RWLOCK_INITIALIZER;
-
- status = pthread_rwlock_rdlock( &rwlock );
- rtems_test_assert( status == 0 );
-
- status = pthread_rwlock_destroy( &rwlock2 );
- rtems_test_assert( status == EINVAL );
-
- status = pthread_rwlock_destroy( &rwlock );
- rtems_test_assert( status == 0 );
-
- status = pthread_rwlock_destroy( &rwlock2 );
- rtems_test_assert( status == 0 );
- rtems_test_assert( rwlock2 != PTHREAD_RWLOCK_INITIALIZER );
-
/*************** ACTUALLY WORK THIS TIME *****************/
puts( "pthread_rwlockattr_init( &attr ) -- OK" );
status = pthread_rwlockattr_init( &attr );
@@ -309,7 +463,6 @@ int main(
rtems_test_assert( status == EINVAL );
/*************** BAD ID CHECK *****************/
- rwlock = 1;
/* make a valid abstime */
puts( "clock_gettime(CLOCK_REALTIME, &abstime) -- OK" );
status = clock_gettime( CLOCK_REALTIME, &abstime );
@@ -317,35 +470,35 @@ int main(
abstime.tv_sec += 5;
puts( "pthread_rwlock_destroy(BadId) -- EINVAL" );
- status = pthread_rwlock_destroy(&rwlock);
+ status = pthread_rwlock_destroy(NULL);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_rdlock(BadId) -- EINVAL" );
- status = pthread_rwlock_rdlock(&rwlock);
+ status = pthread_rwlock_rdlock(NULL);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_timedrdlock(BadId, &abstime) -- EINVAL" );
- status = pthread_rwlock_timedrdlock( &rwlock, &abstime);
+ status = pthread_rwlock_timedrdlock( NULL, &abstime);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_tryrdlock(BadId) -- EINVAL" );
- status = pthread_rwlock_tryrdlock(&rwlock);
+ status = pthread_rwlock_tryrdlock(NULL);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_wrlock(BadId) -- EINVAL" );
- status = pthread_rwlock_wrlock(&rwlock);
+ status = pthread_rwlock_wrlock(NULL);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_timedwrlock(BadId, &abstime) -- EINVAL" );
- status = pthread_rwlock_timedwrlock( &rwlock, &abstime );
+ status = pthread_rwlock_timedwrlock( NULL, &abstime );
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_trywrlock(BadId) -- EINVAL" );
- status = pthread_rwlock_trywrlock(&rwlock);
+ status = pthread_rwlock_trywrlock(NULL);
rtems_test_assert( status == EINVAL );
puts( "pthread_rwlock_unlock(BadId) -- EINVAL" );
- status = pthread_rwlock_unlock(&rwlock);
+ status = pthread_rwlock_unlock(NULL);
rtems_test_assert( status == EINVAL );
/*************** BAD ABSTIME CHECK *****************/
@@ -368,11 +521,6 @@ int main(
puts( "pthread_rwlock_init( &rwlock, &attr ) -- OK" );
status = pthread_rwlock_init( &rwlock, &attr );
rtems_test_assert( status == 0 );
- rtems_test_assert( rwlock != 0 );
-
- puts( "pthread_rwlock_init( &rwlock, &attr ) -- EAGAIN" );
- status = pthread_rwlock_init( &rwlock, &attr );
- rtems_test_assert( status == EAGAIN );
puts( "pthread_rwlock_destroy( &rwlock ) -- OK" );
status = pthread_rwlock_destroy( &rwlock );
@@ -549,7 +697,6 @@ int main(
puts( "pthread_rwlock_init( &rwlock, NULL ) -- OK" );
status = pthread_rwlock_init( &rwlock, NULL );
rtems_test_assert( status == 0 );
- rtems_test_assert( rwlock != 0 );
puts( "pthread_rwlock_unlock ( &rwlock ) -- OK" );
status = pthread_rwlock_unlock( &rwlock );