diff options
Diffstat (limited to 'testsuites/psxtests/psxkey07')
-rw-r--r-- | testsuites/psxtests/psxkey07/Makefile.am | 23 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey07/init.c | 173 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey07/psxkey07.doc | 26 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey07/psxkey07.scn | 18 |
4 files changed, 240 insertions, 0 deletions
diff --git a/testsuites/psxtests/psxkey07/Makefile.am b/testsuites/psxtests/psxkey07/Makefile.am new file mode 100644 index 0000000000..a701f309b2 --- /dev/null +++ b/testsuites/psxtests/psxkey07/Makefile.am @@ -0,0 +1,23 @@ + +rtems_tests_PROGRAMS = psxkey07 +psxkey07_SOURCES = init.c + +dist_rtems_tests_DATA = psxkey07.scn +dist_rtems_tests_DATA += psxkey07.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + + +AM_CPPFLAGS += -I$(top_srcdir)/include +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(psxkey07_OBJECTS) +LINK_LIBS = $(psxkey07_LDLIBS) + +psxkey07$(EXEEXT): $(psxkey07_OBJECTS) $(psxkey07_DEPENDENCIES) + @rm -f psxkey07$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/psxtests/psxkey07/init.c b/testsuites/psxtests/psxkey07/init.c new file mode 100644 index 0000000000..e911dc77d9 --- /dev/null +++ b/testsuites/psxtests/psxkey07/init.c @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2012 Zhongwei Yao. + * COPYRIGHT (c) 1989-2012. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <pthread.h> +#include <sched.h> +#include <errno.h> +#include "tmacros.h" +#include "pmacros.h" + +/* forward declarations to avoid warnings */ +void *POSIX_Init(void *argument); +void *Test_Thread(void *argument); + +pthread_key_t Key; +int created_thread_count, setted_thread_count, got_thread_count; +int all_thread_created; +pthread_mutex_t mutex1, mutex2; +pthread_cond_t create_condition_var, set_condition_var; + +void *Test_Thread( + void *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 ); + pthread_mutex_unlock( &mutex1 ); + + /** + * blocked untill all threads have been created. + */ + pthread_mutex_lock( &mutex2 ); + while( !all_thread_created ) + 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; +} + +void *POSIX_Init( + void *ignored +) +{ + pthread_t *thread_p; + int sc; + struct timespec delay_request; + all_thread_created = 0; + + puts( "\n\n*** TEST KEY 07 ***" ); + + 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 ); + + puts( "Init - pthread Key create - OK" ); + 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 ); + pthread_mutex_unlock( &mutex1 ); + } + 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 ); + rtems_test_assert( created_thread_count == setted_thread_count ); + /* unblock all created pthread to let them set key data.*/ + pthread_mutex_lock( &mutex2 ); + all_thread_created = 1; + pthread_cond_broadcast( &create_condition_var ); + pthread_mutex_unlock( &mutex2 ); + + puts( "Init - sleep - let threads run - OK" ); + delay_request.tv_sec = 0; + delay_request.tv_nsec = 8 * 100000000; + sc = nanosleep( &delay_request, NULL ); + rtems_test_assert( !sc ); + + printf( "Init - %d pthreads have been got key data - OK\n", got_thread_count ); + rtems_test_assert( created_thread_count == got_thread_count ); + puts( "Init - pthread Key delete - OK" ); + sc = pthread_key_delete( Key ); + rtems_test_assert( sc == 0 ); + + puts( "Init - Mutex1 delete - OK" ); + sc = pthread_mutex_destroy( &mutex1 ); + rtems_test_assert( !sc ); + puts( "Init - Mutex2 delete - OK" ); + sc = pthread_mutex_destroy( &mutex2 ); + rtems_test_assert( !sc ); + puts( "Init - Condition variable 1 delete - OK" ); + sc = pthread_cond_destroy( &create_condition_var ); + rtems_test_assert( !sc ); + puts( "Init - Condition variable 2 delete - OK" ); + sc = pthread_cond_destroy( &set_condition_var ); + rtems_test_assert( !sc ); + + puts( "*** END OF TEST KEY 07 ***" ); + rtems_test_exit(0); +} + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + + +#define CONFIGURE_MAXIMUM_POSIX_THREADS rtems_resource_unlimited(10) +#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2 +#define CONFIGURE_MAXIMUM_POSIX_KEYS 1 +#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 2 +#define CONFIGURE_UNIFIED_WORK_AREAS + + + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> + +/* global variables */ diff --git a/testsuites/psxtests/psxkey07/psxkey07.doc b/testsuites/psxtests/psxkey07/psxkey07.doc new file mode 100644 index 0000000000..16d93de78c --- /dev/null +++ b/testsuites/psxtests/psxkey07/psxkey07.doc @@ -0,0 +1,26 @@ +# COPYRIGHT (c) 1989-2009. +# On-Line Applications Research Corporation (OAR). +# +# The license and distribution terms for this file may be +# found in the file LICENSE in this distribution or at +# http://www.rtems.com/license/LICENSE. +# + +This file describes the directives and concepts tested by this test set. + +test set name: psxkey07 + +directives: + + pthread_key_create + pthread_setspecific + pthread_getspecific + pthread_key_delete + +concepts: + ++ Ensure that key data's operation(create, set, get and delete) under unlimited configuration in POSIX API. ++ this test workflow is: + 1. create thread and set thread's key data one by one until exhausting workspace RAM + 2. when step 1 finished, let all thread created thread run the getspecific function to +test if key set and get works correctly. diff --git a/testsuites/psxtests/psxkey07/psxkey07.scn b/testsuites/psxtests/psxkey07/psxkey07.scn new file mode 100644 index 0000000000..851876fce1 --- /dev/null +++ b/testsuites/psxtests/psxkey07/psxkey07.scn @@ -0,0 +1,18 @@ + + +*** TEST KEY 07 *** +Init - Mutex 1 create - OK +Init - Mutex 2 create - OK +Init - Condition variable 1 create - OK +Init - Condition variable 2 create - OK +Init - pthread Key create - OK +Init - 380 pthreads have been created - OK +Init - 380 pthreads have been setted key data - OK +Init - sleep - let threads run - OK +Init - 380 pthreads have been got key data - OK +Init - pthread Key delete - OK +Init - Mutex1 delete - OK +Init - Mutex2 delete - OK +Init - Condition variable 1 delete - OK +Init - Condition variable 2 delete - OK +*** END OF TEST KEY 07 *** |