[rtems commit] POSIX keys now enabled in all configurations.
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Mar 11 12:18:52 UTC 2014
On 2014-03-07 20:13, Joel Sherrill wrote:
> diff --git a/testsuites/psxtests/psxkey07/init.c b/testsuites/psxtests/psxkey07/init.c
> index e911dc7..b2aabb7 100644
> --- a/testsuites/psxtests/psxkey07/init.c
> +++ b/testsuites/psxtests/psxkey07/init.c
> @@ -1,6 +1,6 @@
> /*
> * Copyright (c) 2012 Zhongwei Yao.
> - * COPYRIGHT (c) 1989-2012.
> + * COPYRIGHT (c) 1989-2014.
> * On-Line Applications Research Corporation (OAR).
> *
> * The license and distribution terms for this file may be
> @@ -19,8 +19,8 @@
> #include "pmacros.h"
>
> /* forward declarations to avoid warnings */
> -void *POSIX_Init(void *argument);
> -void *Test_Thread(void *argument);
> +rtems_task Init(rtems_task_argument argument);
> +rtems_task Test_Thread(rtems_task_argument argument);
>
> pthread_key_t Key;
> int created_thread_count, setted_thread_count, got_thread_count;
> @@ -28,17 +28,15 @@ int all_thread_created;
> pthread_mutex_t mutex1, mutex2;
> pthread_cond_t create_condition_var, set_condition_var;
>
> -void *Test_Thread(
> - void *argument
> -)
> +rtems_task Test_Thread(rtems_task_argument argument)
> {
> int sc;
> int *value_p, *value_p2;
>
> value_p = malloc( sizeof( int ) );
> - //printf( "Test_Thread%d - Key pthread_setspecific - OK\n", (int)pthread_self() );
> sc = pthread_setspecific( Key, value_p );
> rtems_test_assert( !sc );
> +
> pthread_mutex_lock( &mutex1 );
> ++setted_thread_count;
> pthread_cond_signal( &set_condition_var );
> @@ -52,21 +50,20 @@ void *Test_Thread(
> pthread_cond_wait( &create_condition_var, &mutex2 );
> pthread_mutex_unlock( &mutex2 );
>
> - //printf( "Test_Thread%d - Key pthread_getspecific - OK\n", (int)pthread_self() );
> value_p2 = pthread_getspecific( Key );
> rtems_test_assert( value_p == value_p2 );
> ++got_thread_count;
>
> - return NULL;
> + rtems_task_delete( RTEMS_SELF );
> }
>
> -void *POSIX_Init(
> - void *ignored
> -)
> +rtems_task Init(rtems_task_argument argument)
> {
> - pthread_t *thread_p;
> - int sc;
> - struct timespec delay_request;
> + rtems_id *thread_p;
> + rtems_status_code rc;
> + int sc;
> + struct timespec delay_request;
> +
> all_thread_created = 0;
>
> puts( "\n\n*** TEST KEY 07 ***" );
> @@ -74,12 +71,15 @@ void *POSIX_Init(
> puts( "Init - Mutex 1 create - OK" );
> sc = pthread_mutex_init( &mutex1, NULL );
> rtems_test_assert( !sc );
> +
> puts( "Init - Mutex 2 create - OK" );
> sc = pthread_mutex_init( &mutex2, NULL );
> rtems_test_assert( !sc );
> +
> puts( "Init - Condition variable 1 create - OK" );
> sc = pthread_cond_init( &create_condition_var, NULL );
> rtems_test_assert( !sc );
> +
> puts( "Init - Condition variable 2 create - OK" );
> sc = pthread_cond_init( &set_condition_var, NULL );
> rtems_test_assert( !sc );
> @@ -88,34 +88,54 @@ void *POSIX_Init(
> sc = pthread_key_create( &Key, NULL );
> rtems_test_assert( !sc );
>
> - for( ; ; )
> - {
> - thread_p = malloc( sizeof( pthread_t ) );
> - rtems_test_assert( thread_p );
> - pthread_mutex_lock( &mutex1 );
> - sc = pthread_create( thread_p, NULL, Test_Thread, NULL );
> - rtems_test_assert( ( sc == 0 ) || ( sc == EAGAIN ) );
> - /**
> - * check if return is EAGAIN, it means RTEMS Workspace RAM
> - * have been exhausted.
> - */
> - if ( sc == EAGAIN )
> - {
> - pthread_mutex_unlock( &mutex1 );
> - break;
> - }
> - ++created_thread_count;
> - /**
> - * wait for test thread set key, the while loop here is used to
> - * avoid suprious wakeup.
> - */
> - while( created_thread_count > setted_thread_count )
> - pthread_cond_wait( &set_condition_var, &mutex1 );
> + for ( ; ; ) {
> + thread_p = malloc( sizeof( rtems_id ) );
> + rtems_test_assert( thread_p );
> + pthread_mutex_lock( &mutex1 );
> +
> + rc = rtems_task_create(
> + rtems_build_name( 'T', 'E', 'S', 'T' ),
> + 1,
> + RTEMS_MINIMUM_STACK_SIZE,
> + RTEMS_DEFAULT_MODES,
> + RTEMS_DEFAULT_ATTRIBUTES,
> + thread_p
> + );
> + rtems_test_assert(
> + ( rc == RTEMS_SUCCESSFUL ) || ( rc == RTEMS_UNSATISFIED )
> + );
> +
> + if ( rc == RTEMS_SUCCESSFUL ) {
> + rc = rtems_task_start( *thread_p, Test_Thread, 0 );
> + rtems_test_assert( rc == RTEMS_SUCCESSFUL );
> + }
> +
> + /**
> + * check if return is EAGAIN, it means RTEMS Workspace RAM
> + * have been exhausted.
> + */
> + if ( rc == RTEMS_UNSATISFIED ) {
> pthread_mutex_unlock( &mutex1 );
> + break;
> }
> - printf( "Init - %d pthreads have been created - OK\n", created_thread_count );
> - printf( "Init - %d pthreads have been setted key data - OK\n", setted_thread_count );
> + ++created_thread_count;
> +
> + /**
> + * wait for test thread set key, the while loop here is used to
> + * avoid suprious wakeup.
> + */
> + while( created_thread_count > setted_thread_count )
> + pthread_cond_wait( &set_condition_var, &mutex1 );
> + pthread_mutex_unlock( &mutex1 );
> + }
> + printf(
> + "Init - %d pthreads have been created - OK\n"
> + "Init - %d pthreads have been setted key data - OK\n",
> + created_thread_count,
> + setted_thread_count
> + );
> rtems_test_assert( created_thread_count == setted_thread_count );
Why did you convert this test to Classic API tasks? It uses POSIX condition
variables and mutexes. I would change it back.
The following patch is necessary if we want to keep the current version:
@@ -104,6 +116,7 @@ rtems_task Init(rtems_task_argument argument)
);
rtems_test_assert(
( rc == RTEMS_SUCCESSFUL ) || ( rc == RTEMS_UNSATISFIED )
+ || ( rc == RTEMS_TOO_MANY )
);
if ( rc == RTEMS_SUCCESSFUL ) {
@@ -112,10 +125,10 @@ rtems_task Init(rtems_task_argument argument)
}
/**
- * check if return is EAGAIN, it means RTEMS Workspace RAM
+ * check if return is not successful, it means RTEMS Workspace RAM
* have been exhausted.
*/
- if ( rc == RTEMS_UNSATISFIED ) {
+ if ( rc != RTEMS_SUCCESSFUL ) {
pthread_mutex_unlock( &mutex1 );
break;
}
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list