diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-18 06:23:27 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-21 07:29:38 +0200 |
commit | 90f1265e5dffe0f834ee9c55640a34fd90be8f12 (patch) | |
tree | 93be90c5b980b2be8d07eac95a9a50c539888cfa /testsuites/psxtests | |
parent | score: Close barrier object before flush (diff) | |
download | rtems-90f1265e5dffe0f834ee9c55640a34fd90be8f12.tar.bz2 |
score: Fix _CORE_semaphore_Flush()
Use proper CORE_semaphore_Status for _CORE_semaphore_Flush() and
_CORE_semaphore_Destroy() operations.
Close #2696.
Diffstat (limited to 'testsuites/psxtests')
-rw-r--r-- | testsuites/psxtests/psxsem01/init.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/testsuites/psxtests/psxsem01/init.c b/testsuites/psxtests/psxsem01/init.c index c1752f3a35..24f6d96465 100644 --- a/testsuites/psxtests/psxsem01/init.c +++ b/testsuites/psxtests/psxsem01/init.c @@ -27,6 +27,55 @@ void *POSIX_Init(void *argument); #define MAX_SEMS 10 +static void *sem_wait_task(void *arg) +{ + sem_t *sem; + int rv; + + sem = arg; + + rv = sem_wait( sem ); + rtems_test_assert( rv == 0 ); + + errno = 0; + rv = sem_wait( sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + return NULL; +} + +static void test_sem_wait_during_delete(void) +{ + sem_t sem; + int rv; + pthread_t th; + int eno; + int val; + + rv = sem_init( &sem, 0, 1 ); + rtems_test_assert( rv == 0 ); + + eno = pthread_create( &th, NULL, sem_wait_task, &sem ); + rtems_test_assert( eno == 0 ); + + rv = sem_getvalue( &sem, &val ); + rtems_test_assert( rv == 0 ); + rtems_test_assert( val == 1 ); + + sched_yield(); + + rv = sem_getvalue( &sem, &val ); + rtems_test_assert( rv == 0 ); + rtems_test_assert( val == 0 ); + + rv = sem_destroy( &sem ); + rtems_test_assert( rv == 0 ); + + eno = pthread_join( th, NULL ); + rtems_test_assert( eno == 0 ); +} + void *POSIX_Init( void *argument ) @@ -295,6 +344,7 @@ void *POSIX_Init( fatal_posix_service_status( errno, ENOENT, "sem_unlink errno ENOENT"); rtems_test_assert( (status == -1) && (errno == ENOENT) ); + test_sem_wait_during_delete(); /* Try adding in unlinking before closing... (can we still open?) */ @@ -312,7 +362,7 @@ void *POSIX_Init( #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION -#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 +#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES MAX_SEMS #define CONFIGURE_POSIX_INIT_THREAD_TABLE |