diff options
Diffstat (limited to 'testsuites/psxtests/psxkey06')
-rw-r--r-- | testsuites/psxtests/psxkey06/Makefile.am | 23 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey06/init.c | 153 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey06/psxkey06.doc | 23 | ||||
-rw-r--r-- | testsuites/psxtests/psxkey06/psxkey06.scn | 18 |
4 files changed, 217 insertions, 0 deletions
diff --git a/testsuites/psxtests/psxkey06/Makefile.am b/testsuites/psxtests/psxkey06/Makefile.am new file mode 100644 index 0000000000..9815baf4eb --- /dev/null +++ b/testsuites/psxtests/psxkey06/Makefile.am @@ -0,0 +1,23 @@ + +rtems_tests_PROGRAMS = psxkey06 +psxkey06_SOURCES = init.c + +dist_rtems_tests_DATA = psxkey06.scn +dist_rtems_tests_DATA += psxkey06.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 = $(psxkey06_OBJECTS) +LINK_LIBS = $(psxkey06_LDLIBS) + +psxkey06$(EXEEXT): $(psxkey06_OBJECTS) $(psxkey06_DEPENDENCIES) + @rm -f psxkey06$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/psxtests/psxkey06/init.c b/testsuites/psxtests/psxkey06/init.c new file mode 100644 index 0000000000..98b46a42be --- /dev/null +++ b/testsuites/psxtests/psxkey06/init.c @@ -0,0 +1,153 @@ +/* + * 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 <errno.h> +#include "tmacros.h" +#include "pmacros.h" + +/* forward declarations to avoid warnings */ +void *POSIX_Init(void *argument); +void *Test_Thread1(void *argument); +void *Test_Thread2(void *argument); + +int Data_array[4] = {1, 2, 3, 4}; + +pthread_key_t key1, key2; + +void *Test_Thread1( + void *argument +) +{ + int sc; + int *value; + struct timespec delay_request; + /* + * Detach ourselves so we don't wait for a join that won't happen. + */ + pthread_detach( pthread_self() ); + + puts( "Test_Thread 1 - key1 pthread_setspecific - OK" ); + sc = pthread_setspecific( key1, &Data_array[0] ); + rtems_test_assert( !sc ); + + puts( "Test_Thread 1 - key2 pthread_setspecific - OK" ); + sc = pthread_setspecific( key2, &Data_array[1] ); + rtems_test_assert( !sc ); + + puts( "Test_Thread 1 - sleep - let thread2 run - OK" ); + delay_request.tv_sec = 0; + delay_request.tv_nsec = 4 * 100000000; + sc = nanosleep( &delay_request, NULL ); + rtems_test_assert( !sc ); + + puts( "Test_Thread 1 - key1 pthread_getspecific - OK" ); + value = pthread_getspecific( key1 ); + rtems_test_assert( *value == Data_array[0] ); + + puts( "Test_Thread 1 - key2 pthread_getspecific - OK" ); + value = pthread_getspecific( key2 ); + rtems_test_assert( *value == Data_array[1] ); + + return NULL; +} + +void *Test_Thread2( + void *argument +) +{ + int sc; + int *value; + /* + * Detach ourselves so we don't wait for a join that won't happen. + */ + pthread_detach( pthread_self() ); + + puts( "Test_Thread 2 - key1 pthread_setspecific - OK" ); + sc = pthread_setspecific( key1, &Data_array[2] ); + rtems_test_assert( !sc ); + + puts( "Test_Thread 2 - key2 pthread_setspecific - OK" ); + sc = pthread_setspecific( key2, &Data_array[3] ); + rtems_test_assert( !sc ); + + puts( "Test_Thread 2 - key1 pthread_getspecific - OK" ); + value = pthread_getspecific( key1 ); + rtems_test_assert( *value == Data_array[2] ); + + puts( "Test_Thread 2 - key2 pthread_getspecific - OK" ); + value = pthread_getspecific( key2 ); + rtems_test_assert( *value == Data_array[3] ); + + return NULL; +} + +void *POSIX_Init( + void *ignored +) +{ + pthread_t thread1, thread2; + int sc; + struct timespec delay_request; + + puts( "\n\n*** TEST KEY 06 ***" ); + + puts( "Init - pthread key1 create - OK" ); + sc = pthread_key_create( &key1, NULL ); + rtems_test_assert( !sc ); + + puts( "Init - pthread key2 create - OK" ); + sc = pthread_key_create( &key2, NULL ); + rtems_test_assert( !sc ); + + puts( "Init - pthread1 create - OK" ); + sc = pthread_create( &thread1, NULL, Test_Thread1, NULL ); + rtems_test_assert( !sc ); + + puts( "Init - pthread2 create - OK" ); + sc = pthread_create( &thread2, NULL, Test_Thread2, NULL ); + rtems_test_assert( !sc ); + + puts( "Init - sleep - let thread run - OK" ); + delay_request.tv_sec = 0; + delay_request.tv_nsec = 8 * 100000000; + sc = nanosleep( &delay_request, NULL ); + rtems_test_assert( !sc ); + + puts( "Init - pthread key1 delete - OK" ); + sc = pthread_key_delete( key1 ); + rtems_test_assert( sc == 0 ); + + puts( "Init - pthread key2 delete - OK" ); + sc = pthread_key_delete( key2 ); + rtems_test_assert( sc == 0 ); + + puts( "*** END OF TEST KEY 06 ***" ); + rtems_test_exit(0); +} + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 3 +#define CONFIGURE_MAXIMUM_POSIX_KEYS 2 + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> + +/* global variables */ diff --git a/testsuites/psxtests/psxkey06/psxkey06.doc b/testsuites/psxtests/psxkey06/psxkey06.doc new file mode 100644 index 0000000000..6becdb9e66 --- /dev/null +++ b/testsuites/psxtests/psxkey06/psxkey06.doc @@ -0,0 +1,23 @@ +# 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: psxkey06 + +directives: + + pthread_key_create + pthread_setspecific + pthread_getspecific + pthread_key_delete + +concepts: + ++ Ensure that key data's operation(create, set, get and delete) under + multikeys and multi threads work. diff --git a/testsuites/psxtests/psxkey06/psxkey06.scn b/testsuites/psxtests/psxkey06/psxkey06.scn new file mode 100644 index 0000000000..a105b6fd8f --- /dev/null +++ b/testsuites/psxtests/psxkey06/psxkey06.scn @@ -0,0 +1,18 @@ +*** TEST KEY 06 *** +Init - pthread key1 create - OK +Init - pthread key2 create - OK +Init - pthread1 create - OK +Init - pthread2 create - OK +Init - sleep - let thread run - OK +Test_Thread 1 - key1 pthread_setspecific - OK +Test_Thread 1 - key2 pthread_setspecific - OK +Test_Thread 1 - sleep - let thread2 run - OK +Test_Thread 2 - key1 pthread_setspecific - OK +Test_Thread 2 - key2 pthread_setspecific - OK +Test_Thread 2 - key1 pthread_getspecific - OK +Test_Thread 2 - key2 pthread_getspecific - OK +Test_Thread 1 - key1 pthread_getspecific - OK +Test_Thread 1 - key2 pthread_getspecific - OK +Init - pthread key1 delete - OK +Init - pthread key2 delete - OK +*** END OF TEST KEY 06 *** |