diff options
author | Joel Sherrill <joel.sherrill@oarcorp.com> | 2014-03-04 15:54:12 -0600 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@oarcorp.com> | 2014-03-07 13:21:11 -0600 |
commit | e6c87f78724743bc74a38678f93ed579ace840f2 (patch) | |
tree | dce3962edb00574dade0c8caf837cd85b9607831 | |
parent | Remove trailing whitespace in previous patches (diff) | |
download | rtems-e6c87f78724743bc74a38678f93ed579ace840f2.tar.bz2 |
POSIX keys now enabled in all configurations.
Formerly POSIX keys were only enabled when POSIX threads
were enabled. Because they are a truly safe alternative
to per-task variables in an SMP system, they are being
enabled in all configurations.
38 files changed, 537 insertions, 498 deletions
diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index f9eeef2a43..53a588749d 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -15,6 +15,12 @@ include_rtems_posixdir = $(includedir)/rtems/posix include_rtems_posix_HEADERS = include/rtems/posix/sigset.h +## Some POSIX threads features are needed all the time +include_rtems_posix_HEADERS += include/rtems/posix/key.h +include_rtems_posix_HEADERS += include/rtems/posix/keyimpl.h +include_rtems_posix_HEADERS += include/rtems/posix/config.h +include_rtems_posix_HEADERS += include/rtems/posix/posixapi.h + if HAS_PTHREADS # include include_HEADERS = include/aio.h @@ -26,15 +32,11 @@ include_rtems_posix_HEADERS += include/rtems/posix/aio_misc.h include_rtems_posix_HEADERS += include/rtems/posix/cancel.h include_rtems_posix_HEADERS += include/rtems/posix/cond.h include_rtems_posix_HEADERS += include/rtems/posix/condimpl.h -include_rtems_posix_HEADERS += include/rtems/posix/config.h -include_rtems_posix_HEADERS += include/rtems/posix/key.h -include_rtems_posix_HEADERS += include/rtems/posix/keyimpl.h include_rtems_posix_HEADERS += include/rtems/posix/mqueue.h include_rtems_posix_HEADERS += include/rtems/posix/mqueueimpl.h include_rtems_posix_HEADERS += include/rtems/posix/mutex.h include_rtems_posix_HEADERS += include/rtems/posix/muteximpl.h include_rtems_posix_HEADERS += include/rtems/posix/onceimpl.h -include_rtems_posix_HEADERS += include/rtems/posix/posixapi.h include_rtems_posix_HEADERS += include/rtems/posix/priorityimpl.h include_rtems_posix_HEADERS += include/rtems/posix/psignal.h include_rtems_posix_HEADERS += include/rtems/posix/psignalimpl.h @@ -89,11 +91,6 @@ libposix_a_SOURCES += src/cond.c src/condattrdestroy.c \ src/condinit.c src/condsignal.c src/condsignalsupp.c \ src/condtimedwait.c src/condwait.c src/condwaitsupp.c src/condget.c -## KEY_C_FILES -libposix_a_SOURCES += src/key.c src/keycreate.c src/keydelete.c \ - src/keygetspecific.c src/keyfreememory.c src/keyrundestructors.c \ - src/keysetspecific.c - ## MEMORY_C_FILES libposix_a_SOURCES += src/mprotect.c @@ -158,6 +155,11 @@ libposix_a_SOURCES += src/psignal.c src/alarm.c src/kill.c src/killinfo.c \ src/pthreadsigmask.c src/sigaction.c endif +## KEY_C_FILES +libposix_a_SOURCES += src/key.c src/keycreate.c src/keydelete.c \ + src/keygetspecific.c src/keyfreememory.c src/keyrundestructors.c \ + src/keysetspecific.c + libposix_a_SOURCES += src/sigaddset.c src/sigdelset.c src/sigfillset.c \ src/sigemptyset.c src/sigismember.c diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h index 83bd1def58..58dfb59237 100644 --- a/cpukit/posix/include/rtems/posix/config.h +++ b/cpukit/posix/include/rtems/posix/config.h @@ -8,7 +8,7 @@ */ /* - * COPYRIGHT (c) 1989-2013. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -76,22 +76,6 @@ typedef struct { /** * This field contains the maximum number of POSIX API - * keys which are configured for this application. - */ - uint32_t maximum_keys; - - /** - * This field contains the maximum number of POSIX API - * key value pairs which are configured for this application. - * - * @note There can be potentially be a key/value pair for - * every thread to use every key. But normally this - * many are not needed in a system. - */ - uint32_t maximum_key_value_pairs; - - /** - * This field contains the maximum number of POSIX API * timers which are configured for this application. */ uint32_t maximum_timers; diff --git a/cpukit/posix/include/rtems/posix/threadsup.h b/cpukit/posix/include/rtems/posix/threadsup.h index 6bb3b844cc..f5d57ebe23 100644 --- a/cpukit/posix/include/rtems/posix/threadsup.h +++ b/cpukit/posix/include/rtems/posix/threadsup.h @@ -7,7 +7,7 @@ */ /* - * COPYRIGHT (c) 1989-2011. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -90,15 +90,6 @@ typedef struct { struct _pthread_cleanup_context *last_cleanup_context; #endif /* HAVE_STRUCT__PTHREAD_CLEANUP_CONTEXT */ - /** - * This is the thread key value chain's control, which is used - * to track all key value for specific thread, and when thread - * exits, we can remove all key value for specific thread by - * iterating this chain, or we have to search a whole rbtree, - * which is inefficient. - */ - Chain_Control Key_Chain; - } POSIX_API_Control; /** diff --git a/cpukit/posix/preinstall.am b/cpukit/posix/preinstall.am index d0e238cd15..d8ca9cdf26 100644 --- a/cpukit/posix/preinstall.am +++ b/cpukit/posix/preinstall.am @@ -27,6 +27,22 @@ $(PROJECT_INCLUDE)/rtems/posix/sigset.h: include/rtems/posix/sigset.h $(PROJECT_ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/sigset.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/sigset.h +$(PROJECT_INCLUDE)/rtems/posix/key.h: include/rtems/posix/key.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/key.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/key.h + +$(PROJECT_INCLUDE)/rtems/posix/keyimpl.h: include/rtems/posix/keyimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/keyimpl.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/keyimpl.h + +$(PROJECT_INCLUDE)/rtems/posix/config.h: include/rtems/posix/config.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/config.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/config.h + +$(PROJECT_INCLUDE)/rtems/posix/posixapi.h: include/rtems/posix/posixapi.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/posixapi.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/posixapi.h + if HAS_PTHREADS $(PROJECT_INCLUDE)/aio.h: include/aio.h $(PROJECT_INCLUDE)/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/aio.h @@ -56,18 +72,6 @@ $(PROJECT_INCLUDE)/rtems/posix/condimpl.h: include/rtems/posix/condimpl.h $(PROJ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/condimpl.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/condimpl.h -$(PROJECT_INCLUDE)/rtems/posix/config.h: include/rtems/posix/config.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/config.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/config.h - -$(PROJECT_INCLUDE)/rtems/posix/key.h: include/rtems/posix/key.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/key.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/key.h - -$(PROJECT_INCLUDE)/rtems/posix/keyimpl.h: include/rtems/posix/keyimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/keyimpl.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/keyimpl.h - $(PROJECT_INCLUDE)/rtems/posix/mqueue.h: include/rtems/posix/mqueue.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/mqueue.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/mqueue.h @@ -88,10 +92,6 @@ $(PROJECT_INCLUDE)/rtems/posix/onceimpl.h: include/rtems/posix/onceimpl.h $(PROJ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/onceimpl.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/onceimpl.h -$(PROJECT_INCLUDE)/rtems/posix/posixapi.h: include/rtems/posix/posixapi.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) - $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/posixapi.h -PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/posixapi.h - $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h: include/rtems/posix/priorityimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/priorityimpl.h diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c index 2b32b50bcf..41bb946521 100644 --- a/cpukit/posix/src/key.c +++ b/cpukit/posix/src/key.c @@ -7,7 +7,7 @@ /* * Copyright (c) 2012 Zhongwei Yao. - * COPYRIGHT (c) 1989-2008. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -19,8 +19,9 @@ #include "config.h" #endif +#include <rtems/config.h> + #include <rtems/posix/keyimpl.h> -#include <rtems/posix/config.h> #include <rtems/score/chainimpl.h> #include <rtems/score/objectimpl.h> #include <rtems/score/wkspace.h> @@ -72,7 +73,7 @@ int _POSIX_Keys_Key_value_lookup_tree_compare_function( static uint32_t _POSIX_Keys_Get_keypool_bump_count( void ) { - uint32_t max = Configuration_POSIX_API.maximum_key_value_pairs; + uint32_t max = Configuration.maximum_key_value_pairs; return _Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0; @@ -80,7 +81,7 @@ static uint32_t _POSIX_Keys_Get_keypool_bump_count( void ) static uint32_t _POSIX_Keys_Get_initial_keypool_size( void ) { - uint32_t max = Configuration_POSIX_API.maximum_key_value_pairs; + uint32_t max = Configuration.maximum_key_value_pairs; return _Objects_Maximum_per_allocation( max ); } @@ -135,7 +136,7 @@ void _POSIX_Key_Manager_initialization(void) &_POSIX_Keys_Information, /* object information table */ OBJECTS_POSIX_API, /* object API */ OBJECTS_POSIX_KEYS, /* object class */ - Configuration_POSIX_API.maximum_keys, + Configuration.maximum_keys, /* maximum objects of this class */ sizeof( POSIX_Keys_Control ), /* size of this object's control block */ diff --git a/cpukit/posix/src/keyrundestructors.c b/cpukit/posix/src/keyrundestructors.c index 2545486940..312cf35e68 100644 --- a/cpukit/posix/src/keyrundestructors.c +++ b/cpukit/posix/src/keyrundestructors.c @@ -9,7 +9,7 @@ * Copyright (c) 2012 Zhongwei Yao. * Copyright (c) 2010 embedded brains GmbH. * - * COPYRIGHT (c) 1989-2007. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -22,8 +22,8 @@ #endif #include <rtems/posix/keyimpl.h> -#include <rtems/posix/threadsup.h> #include <rtems/score/chainimpl.h> +#include <rtems/score/thread.h> /* * _POSIX_Keys_Run_destructors @@ -46,9 +46,7 @@ void _POSIX_Keys_Run_destructors( _Thread_Disable_dispatch(); - chain = &( - (POSIX_API_Control *)thread->API_Extensions[ THREAD_API_POSIX ] - )->Key_Chain; + chain = &thread->Key_Chain; iter = (POSIX_Keys_Key_value_pair *) _Chain_First( chain ); while ( !_Chain_Is_tail( chain, &iter->Key_values_per_thread_node ) ) { next = (POSIX_Keys_Key_value_pair *) diff --git a/cpukit/posix/src/keysetspecific.c b/cpukit/posix/src/keysetspecific.c index 5cfa90e4e7..c6e2d30151 100644 --- a/cpukit/posix/src/keysetspecific.c +++ b/cpukit/posix/src/keysetspecific.c @@ -7,7 +7,7 @@ /* * Copyright (c) 2012 Zhongwei Yao. - * COPYRIGHT (c) 1989-2007. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -20,7 +20,7 @@ #endif #include <rtems/posix/keyimpl.h> -#include <rtems/posix/threadsup.h> +#include <rtems/score/thread.h> #include <rtems/score/chainimpl.h> #include <errno.h> @@ -37,7 +37,6 @@ int pthread_setspecific( POSIX_Keys_Control *the_key; Objects_Locations location; POSIX_Keys_Key_value_pair *value_pair_ptr; - POSIX_API_Control *api; the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { @@ -55,7 +54,7 @@ int pthread_setspecific( value_pair_ptr->thread_id = _Thread_Executing->Object.id; value_pair_ptr->value = value; if ( _RBTree_Insert( &_POSIX_Keys_Key_value_lookup_tree, - &(value_pair_ptr->Key_value_lookup_node) ) ) { + &(value_pair_ptr->Key_value_lookup_node) ) ) { _Freechain_Put( (Freechain_Control *)&_POSIX_Keys_Keypool, (void *) value_pair_ptr ); _Objects_Put( &the_key->Object ); @@ -64,9 +63,10 @@ int pthread_setspecific( } /** append rb_node to the thread API extension's chain */ - api = (POSIX_API_Control *)\ - (_Thread_Executing->API_Extensions[THREAD_API_POSIX]); - _Chain_Append_unprotected( &api->Key_Chain, &value_pair_ptr->Key_values_per_thread_node ); + _Chain_Append_unprotected( + &_Thread_Executing->Key_Chain, + &value_pair_ptr->Key_values_per_thread_node + ); _Objects_Put( &the_key->Object ); diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c index 67b62ae67e..33577a22ac 100644 --- a/cpukit/posix/src/pthread.c +++ b/cpukit/posix/src/pthread.c @@ -6,7 +6,7 @@ */ /* - * COPYRIGHT (c) 1989-2013. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -247,9 +247,6 @@ static bool _POSIX_Threads_Create_extension( created ); - /** initialize thread's key vaule node chain */ - _Chain_Initialize_empty( &api->Key_Chain ); - return true; } @@ -275,11 +272,6 @@ static void _POSIX_Threads_Delete_extension( _POSIX_Threads_cancel_run( deleted ); /* - * Run all the key destructors - */ - _POSIX_Keys_Run_destructors( deleted ); - - /* * Wakeup all the tasks which joined with this one */ value_ptr = (void **) deleted->Wait.return_argument; diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c index 9a2a96f567..41347461ba 100644 --- a/cpukit/rtems/src/tasks.c +++ b/cpukit/rtems/src/tasks.c @@ -6,7 +6,7 @@ */ /* - * COPYRIGHT (c) 1989-2009. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -125,6 +125,11 @@ static void _RTEMS_tasks_Delete_extension( } /* + * Run all the key destructors + */ + _POSIX_Keys_Run_destructors( deleted ); + + /* * Free API specific memory */ diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index f016b07254..08b8b5f4d7 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -29,7 +29,7 @@ */ /* - * COPYRIGHT (c) 1989-2011. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -1722,8 +1722,33 @@ const rtems_libio_helper rtems_fs_init_helper = * POSIX API Configuration Parameters */ -#ifdef RTEMS_POSIX_API +/* + * POSIX Keys are available whether or not the POSIX API is enabled. + */ +#include <rtems/posix/key.h> + +#ifndef CONFIGURE_MAXIMUM_POSIX_KEYS + #define CONFIGURE_MAXIMUM_POSIX_KEYS 0 + #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS 0 +#else + #ifndef CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS + #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS \ + (CONFIGURE_MAXIMUM_POSIX_KEYS * \ + (CONFIGURE_MAXIMUM_POSIX_THREADS + CONFIGURE_MAXIMUM_TASKS)) + #endif +#endif +#define CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys, _key_value_pairs) \ + (_Configure_Object_RAM(_keys, sizeof(POSIX_Keys_Control) ) \ + + _Configure_From_workspace( \ + _key_value_pairs * sizeof(POSIX_Keys_Key_value_pair))) + +/* + * The rest of the POSIX threads API features are only available when + * POSIX is enabled. + */ + +#ifdef RTEMS_POSIX_API #include <sys/types.h> #include <signal.h> #include <limits.h> @@ -1732,7 +1757,6 @@ const rtems_libio_helper rtems_fs_init_helper = #include <rtems/posix/cond.h> #include <rtems/posix/mqueue.h> #include <rtems/posix/mutex.h> - #include <rtems/posix/key.h> #include <rtems/posix/psignal.h> #include <rtems/posix/pthread.h> #include <rtems/posix/rwlock.h> @@ -1774,20 +1798,6 @@ const rtems_libio_helper rtems_fs_init_helper = _Configure_Object_RAM(_condvars, \ sizeof(POSIX_Condition_variables_Control) ) - #ifndef CONFIGURE_MAXIMUM_POSIX_KEYS - #define CONFIGURE_MAXIMUM_POSIX_KEYS 0 - #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS 0 - #else - #ifndef CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS - #define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS \ - CONFIGURE_MAXIMUM_POSIX_KEYS \ - * (CONFIGURE_MAXIMUM_POSIX_THREADS + CONFIGURE_MAXIMUM_TASKS) - #endif - #endif - #define CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys, _key_value_pairs) \ - (_Configure_Object_RAM(_keys, sizeof(POSIX_Keys_Control) ) \ - + _Configure_From_workspace(_key_value_pairs * sizeof(POSIX_Keys_Key_value_pair))) - #ifndef CONFIGURE_MAXIMUM_POSIX_TIMERS #define CONFIGURE_MAXIMUM_POSIX_TIMERS 0 #endif @@ -1894,8 +1904,6 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES( \ CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES + \ CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES) + \ - CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS, \ - CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ) + \ CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \ CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ) + \ CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \ @@ -2213,6 +2221,9 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_MEMORY_FOR_TASKS( \ CONFIGURE_TOTAL_TASKS_AND_THREADS, CONFIGURE_TOTAL_TASKS_AND_THREADS) + \ CONFIGURE_MEMORY_FOR_CLASSIC + \ + CONFIGURE_MEMORY_FOR_POSIX_KEYS( \ + CONFIGURE_MAXIMUM_POSIX_KEYS, \ + CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ) + \ CONFIGURE_MEMORY_FOR_POSIX + \ CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \ CONFIGURE_MEMORY_FOR_MP + \ @@ -2344,8 +2355,6 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES + CONFIGURE_MAXIMUM_ADA_TASKS + CONFIGURE_MAXIMUM_FAKE_ADA_TASKS + CONFIGURE_GO_INIT_CONDITION_VARIABLES + CONFIGURE_MAXIMUM_GO_CHANNELS, - CONFIGURE_MAXIMUM_POSIX_KEYS, - CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS, CONFIGURE_MAXIMUM_POSIX_TIMERS, CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS, CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES, @@ -2389,6 +2398,8 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_EXECUTIVE_RAM_SIZE, /* required RTEMS workspace */ CONFIGURE_STACK_SPACE_SIZE, /* required stack space */ CONFIGURE_MAXIMUM_USER_EXTENSIONS, /* maximum dynamic extensions */ + CONFIGURE_MAXIMUM_POSIX_KEYS, /* POSIX keys are always */ + CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS, /* enabled */ CONFIGURE_MICROSECONDS_PER_TICK, /* microseconds per clock tick */ 1000 * CONFIGURE_MICROSECONDS_PER_TICK, /* nanoseconds per clock tick */ CONFIGURE_TICKS_PER_TIMESLICE, /* ticks per timeslice quantum */ @@ -2525,11 +2536,13 @@ const rtems_libio_helper rtems_fs_init_helper = uint32_t BARRIERS; uint32_t USER_EXTENSIONS; + /* POSIX API managers that are always enabled */ + uint32_t POSIX_KEYS; + #ifdef RTEMS_POSIX_API /* POSIX API Pieces */ uint32_t POSIX_MUTEXES; uint32_t POSIX_CONDITION_VARIABLES; - uint32_t POSIX_KEYS; uint32_t POSIX_TIMERS; uint32_t POSIX_QUEUED_SIGNALS; uint32_t POSIX_MESSAGE_QUEUES; @@ -2580,6 +2593,8 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS), CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_BARRIERS), CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS), + CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS, \ + CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ), #ifdef RTEMS_POSIX_API /* POSIX API Pieces */ @@ -2589,8 +2604,6 @@ const rtems_libio_helper rtems_fs_init_helper = CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES( CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES + CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES), - CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS, \ - CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS ), CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ), CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( @@ -2655,13 +2668,15 @@ const rtems_libio_helper rtems_fs_init_helper = /* * If an attempt was made to configure POSIX objects and * the POSIX API was not configured into RTEMS, error out. + * + * @note POSIX Keys are always available so the parameters + * CONFIGURE_MAXIMUM_POSIX_KEYS and + * CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS are not in this list. */ #if !defined(RTEMS_POSIX_API) #if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_MUTEXES != 0) || \ (CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES != 0) || \ - (CONFIGURE_MAXIMUM_POSIX_KEYS != 0) || \ - (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \ @@ -2747,14 +2762,11 @@ const rtems_libio_helper rtems_fs_init_helper = * POSIX Key pair shouldn't be less than POSIX Key, which is highly * likely to be error. */ -#if defined(RTEMS_POSIX_API) - #if (CONFIGURE_MAXIMUM_POSIX_KEYS != 0) && \ - (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS != 0) - #if (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS < \ - CONFIGURE_MAXIMUM_POSIX_KEYS) - #error "Fewer POSIX Key pairs than POSIX Key!" - #endif - #endif +#if (CONFIGURE_MAXIMUM_POSIX_KEYS != 0) && \ + (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS != 0) + #if (CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS < CONFIGURE_MAXIMUM_POSIX_KEYS) + #error "Fewer POSIX Key pairs than POSIX Key!" + #endif #endif #endif diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h index d25b905ee2..8a77ea3ae6 100644 --- a/cpukit/sapi/include/rtems/config.h +++ b/cpukit/sapi/include/rtems/config.h @@ -8,7 +8,7 @@ */ /* - * COPYRIGHT (c) 1989-2011. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -143,6 +143,22 @@ typedef struct { */ uint32_t maximum_extensions; + /** + * This field contains the maximum number of POSIX API + * keys which are configured for this application. + */ + uint32_t maximum_keys; + + /** + * This field contains the maximum number of POSIX API + * key value pairs which are configured for this application. + * + * @note There can be potentially be a key/value pair for + * every thread to use every key. But normally this + * many are not needed in a system. + */ + uint32_t maximum_key_value_pairs; + /** * This field specifies the number of microseconds which elapse * between clock ticks. This is the basis for RTEMS timing. diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c index 73ebea9929..077a092b0e 100644 --- a/cpukit/sapi/src/exinit.c +++ b/cpukit/sapi/src/exinit.c @@ -1,15 +1,13 @@ /** * @file * - * @brief Device Driver Initialization Functions + * @brief Initialization Manager * * @ingroup ClassicRTEMS */ /* - * Initialization Manager - * - * COPYRIGHT (c) 1989-2011. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -57,9 +55,7 @@ #include <rtems/rtems/rtemsapi.h> -#ifdef RTEMS_POSIX_API - #include <rtems/posix/posixapi.h> -#endif +#include <rtems/posix/posixapi.h> Objects_Information *_Internal_Objects[ OBJECTS_INTERNAL_CLASSES_LAST + 1 ]; @@ -147,9 +143,7 @@ void rtems_initialize_data_structures(void) _IO_Manager_initialization(); - #ifdef RTEMS_POSIX_API - _POSIX_API_Initialize(); - #endif + _POSIX_API_Initialize(); _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING ); diff --git a/cpukit/sapi/src/posixapi.c b/cpukit/sapi/src/posixapi.c index bcf807eab2..de502ec88d 100644 --- a/cpukit/sapi/src/posixapi.c +++ b/cpukit/sapi/src/posixapi.c @@ -7,7 +7,7 @@ */ /* - * COPYRIGHT (c) 1989-2010. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -22,19 +22,21 @@ #define POSIX_API_INIT #include <rtems/system.h> /* include this before checking RTEMS_POSIX_API */ -#ifdef RTEMS_POSIX_API +#include <rtems/config.h> +#include <rtems/posix/keyimpl.h> +#include <rtems/posix/posixapi.h> + +#ifdef RTEMS_POSIX_API #include <sys/types.h> #include <mqueue.h> #include <rtems/config.h> #include <rtems/posix/barrierimpl.h> -#include <rtems/posix/condimpl.h> #include <rtems/posix/config.h> -#include <rtems/posix/keyimpl.h> +#include <rtems/posix/condimpl.h> #include <rtems/posix/mqueueimpl.h> #include <rtems/posix/muteximpl.h> #include <rtems/posix/onceimpl.h> -#include <rtems/posix/posixapi.h> #include <rtems/posix/priorityimpl.h> #include <rtems/posix/psignalimpl.h> #include <rtems/posix/pthreadimpl.h> @@ -43,6 +45,7 @@ #include <rtems/posix/semaphoreimpl.h> #include <rtems/posix/spinlockimpl.h> #include <rtems/posix/time.h> +#endif void _POSIX_Fatal_error( POSIX_Fatal_domain domain, int eno ) { @@ -68,18 +71,19 @@ void _POSIX_API_Initialize(void) */ _Objects_Information_table[OBJECTS_POSIX_API] = _POSIX_Objects; - _POSIX_signals_Manager_Initialization(); - _POSIX_Threads_Manager_initialization(); - _POSIX_Condition_variables_Manager_initialization(); _POSIX_Key_Manager_initialization(); - _POSIX_Mutex_Manager_initialization(); - _POSIX_Message_queue_Manager_initialization(); - _POSIX_Once_Manager_initialization(); - _POSIX_Semaphore_Manager_initialization(); - _POSIX_Timer_Manager_initialization(); - _POSIX_Barrier_Manager_initialization(); - _POSIX_RWLock_Manager_initialization(); - _POSIX_Spinlock_Manager_initialization(); -} -#endif + #ifdef RTEMS_POSIX_API + _POSIX_signals_Manager_Initialization(); + _POSIX_Threads_Manager_initialization(); + _POSIX_Condition_variables_Manager_initialization(); + _POSIX_Mutex_Manager_initialization(); + _POSIX_Message_queue_Manager_initialization(); + _POSIX_Once_Manager_initialization(); + _POSIX_Semaphore_Manager_initialization(); + _POSIX_Timer_Manager_initialization(); + _POSIX_Barrier_Manager_initialization(); + _POSIX_RWLock_Manager_initialization(); + _POSIX_Spinlock_Manager_initialization(); + #endif +} diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h index ed12ad272a..527be58110 100644 --- a/cpukit/score/include/rtems/score/thread.h +++ b/cpukit/score/include/rtems/score/thread.h @@ -8,7 +8,7 @@ */ /* - * COPYRIGHT (c) 1989-2009. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -471,8 +471,19 @@ struct Thread_Control_struct { void *API_Extensions[ THREAD_API_LAST + 1 ]; /** This field points to the user extension pointers. */ void **extensions; + /** This field points to the set of per task variables. */ rtems_task_variable_t *task_variables; + + /** + * This is the thread key value chain's control, which is used + * to track all key value for specific thread, and when thread + * exits, we can remove all key value for specific thread by + * iterating this chain, or we have to search a whole rbtree, + * which is inefficient. + */ + Chain_Control Key_Chain; + }; #if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE) diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c index acd6636ac8..808c425d33 100644 --- a/cpukit/score/src/threadinitialize.c +++ b/cpukit/score/src/threadinitialize.c @@ -2,6 +2,7 @@ * @file * * @brief Initialize Thread + * * @ingroup ScoreThread */ /* @@ -233,6 +234,11 @@ bool _Thread_Initialize( #endif /* + * initialize thread's key vaule node chain + */ + _Chain_Initialize_empty( &the_thread->Key_Chain ); + + /* * Open the object */ _Objects_Open( information, &the_thread->Object, name ); diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am index 0d457ea00c..fd4ceac338 100644 --- a/testsuites/psxtests/Makefile.am +++ b/testsuites/psxtests/Makefile.am @@ -7,8 +7,7 @@ SUBDIRS += psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 psx09 \ psxaio01 psxaio02 psxaio03 \ psxalarm01 psxautoinit01 psxautoinit02 psxbarrier01 \ psxcancel psxcancel01 psxclassic01 psxcleanup psxcleanup01 \ - psxcond01 psxconfig01 psxenosys psxkey01 psxkey02 psxkey03 psxkey04 \ - psxkey05 psxkey06 psxkey07 psxkey08 psxkey09 psxkey10 \ + psxcond01 psxconfig01 psxenosys \ psxitimer psxmsgq01 psxmsgq02 psxmsgq03 psxmsgq04 \ psxmutexattr01 psxobj01 psxrwlock01 psxsem01 psxsignal01 psxsignal02 \ psxsignal03 psxsignal04 psxsignal05 psxsignal06 \ @@ -23,6 +22,14 @@ SUBDIRS += psxfile01 psxfile02 psxfilelock01 psxgetrusage01 psxid01 \ psximfs01 psximfs02 psxreaddir psxstat psxmount psx13 psxchroot01 \ psxpasswd01 psxpasswd02 psxpipe01 psxtimes01 psxfchx01 +## POSIX Keys are always available +SUBDIRS += psxkey01 psxkey02 psxkey03 psxkey04 \ + psxkey05 psxkey06 psxkey08 psxkey09 psxkey10 +## But some of the tests need other POSIX features +if HAS_POSIX +SUBDIRS += psxkey07 +endif + SUBDIRS += psxrdwrv include $(top_srcdir)/../automake/subdirs.am diff --git a/testsuites/psxtests/psxkey01/Makefile.am b/testsuites/psxtests/psxkey01/Makefile.am index bb9b119b7d..e5cb1f5400 100644 --- a/testsuites/psxtests/psxkey01/Makefile.am +++ b/testsuites/psxtests/psxkey01/Makefile.am @@ -1,9 +1,8 @@ rtems_tests_PROGRAMS = psxkey01 -psxkey01_SOURCES = init.c task.c system.h ../include/pmacros.h \ +psxkey01_SOURCES = init.c system.h ../include/pmacros.h \ ../../support/src/test_support.c - dist_rtems_tests_DATA = psxkey01.scn include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg diff --git a/testsuites/psxtests/psxkey01/init.c b/testsuites/psxtests/psxkey01/init.c index e63407cda8..da51043e43 100644 --- a/testsuites/psxtests/psxkey01/init.c +++ b/testsuites/psxtests/psxkey01/init.c @@ -17,39 +17,30 @@ #include "tmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init(rtems_task_argument argument); void Key_destructor(void *key_data); void Key_destructor(void *key_data) { } -void *POSIX_Init( - void *argument -) +rtems_task Init(rtems_task_argument argument) { int status; puts( "\n\n*** POSIX KEY 01 TEST ***" ); - /* set the time of day, and print our buffer in multiple ways */ - - set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 ); - /* get id of this thread */ - Init_id = pthread_self(); + Init_id = rtems_task_self(); printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id ); rtems_workspace_greedy_allocate( NULL, 0 ); puts("Init: pthread_key_create - OK"); - empty_line(); status = pthread_key_create( &Key_id[0], Key_destructor ); fatal_directive_check_status_only( status, 0, "OK" ); puts( "*** END OF POSIX KEY 01 TEST ***" ); rtems_test_exit( 0 ); - - return NULL; /* just so the compiler thinks we returned something */ } diff --git a/testsuites/psxtests/psxkey01/psxkey01.scn b/testsuites/psxtests/psxkey01/psxkey01.scn index e1a747c8ab..e9dacb8a00 100644 --- a/testsuites/psxtests/psxkey01/psxkey01.scn +++ b/testsuites/psxtests/psxkey01/psxkey01.scn @@ -1,5 +1,4 @@ *** POSIX KEY 01 TEST *** Init's ID is 0x0b010001 Init: pthread_key_create - OK - *** END OF POSIX KEY 01 TEST *** diff --git a/testsuites/psxtests/psxkey01/system.h b/testsuites/psxtests/psxkey01/system.h index d441a3b2ef..c5c9e0f862 100644 --- a/testsuites/psxtests/psxkey01/system.h +++ b/testsuites/psxtests/psxkey01/system.h @@ -1,9 +1,12 @@ -/* system.h +/** + * @file * * This include file contains information that is included in every * function in the test set. - * - * COPYRIGHT (c) 1989-1999. + */ + +/* + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -15,24 +18,15 @@ #include <pmacros.h> -void *POSIX_Init( - void *argument -); - -void *Task_1( - void *argument -); - - /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 21 -#define CONFIGURE_MAXIMUM_POSIX_KEYS 21 +#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #include <rtems/confdefs.h> @@ -45,9 +39,8 @@ void *Task_1( #endif TEST_EXTERN pthread_t Init_id; -TEST_EXTERN pthread_t Task_id[CONFIGURE_MAXIMUM_POSIX_THREADS-1]; -TEST_EXTERN pthread_key_t Key_id[CONFIGURE_MAXIMUM_POSIX_KEYS-1]; -TEST_EXTERN uint32_t Data_array[ CONFIGURE_MAXIMUM_POSIX_THREADS ]; +TEST_EXTERN pthread_key_t Key_id[CONFIGURE_MAXIMUM_POSIX_KEYS - 1]; +TEST_EXTERN uint32_t Data_array[ CONFIGURE_MAXIMUM_TASKS ]; #undef TEST_EXTERN /* end of include file */ diff --git a/testsuites/psxtests/psxkey01/task.c b/testsuites/psxtests/psxkey01/task.c deleted file mode 100644 index 4f83ebeecf..0000000000 --- a/testsuites/psxtests/psxkey01/task.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Task_1 - * - * This routine serves as a test task. It verifies the basic task - * switching capabilities of the executive. - * - * Input parameters: - * argument - task argument - * - * Output parameters: NONE - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "system.h" -#include <errno.h> - -void *Task_1( - void *arg -) -{ - pthread_t id = *(pthread_t *) arg; - int status; - uint32_t *key_data; - - printf( "Thread 0x%08" PRIxpthread_t "\n", id ); - printf( "Task_1: Setting the key to %d\n", 1 ); - status = pthread_setspecific( Key_id[0], (void *)&Data_array[ 1 ] ); - if ( status ) - printf( "status = %d\n", status ); - rtems_test_assert( !status ); - - key_data = pthread_getspecific( Key_id[0] ); - printf( "Task_1: Got the key value of %ld\n", - (unsigned long) ((uint32_t *)key_data - Data_array) ); - if ( status ) - printf( "status = %d\n", status ); - rtems_test_assert( !status ); - - puts( "Task_1: exitting" ); - pthread_exit( NULL ); - - /* switch to task 2 */ - - return NULL; /* just so the compiler thinks we returned something */ -} diff --git a/testsuites/psxtests/psxkey02/init.c b/testsuites/psxtests/psxkey02/init.c index 6055dac828..6fc6a3c7a3 100644 --- a/testsuites/psxtests/psxkey02/init.c +++ b/testsuites/psxtests/psxkey02/init.c @@ -1,5 +1,5 @@ /* - * COPYRIGHT (c) 1989-2012. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -18,11 +18,9 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init(rtems_task_argument ignored); -void *POSIX_Init( - void *ignored -) +rtems_task Init(rtems_task_argument ignored) { pthread_key_t key; int eno; @@ -84,10 +82,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 +#define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey02/psxkey02.scn b/testsuites/psxtests/psxkey02/psxkey02.scn index fbc3342a23..f5a5f71f60 100644 --- a/testsuites/psxtests/psxkey02/psxkey02.scn +++ b/testsuites/psxtests/psxkey02/psxkey02.scn @@ -1,6 +1,8 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + + *** TEST KEY 02 *** Init - pthread_key_create - ENOMEM Init - pthread_key_delete - OK Init - verify workspace has same memory *** END OF TEST KEY 02 *** - diff --git a/testsuites/psxtests/psxkey03/init.c b/testsuites/psxtests/psxkey03/init.c index 0d12799515..7df359235a 100644 --- a/testsuites/psxtests/psxkey03/init.c +++ b/testsuites/psxtests/psxkey03/init.c @@ -1,5 +1,5 @@ /* - * COPYRIGHT (c) 1989-2012. + * COPYRIGHT (c) 1989-2014. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -17,9 +17,10 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init(rtems_task_argument value ); +rtems_task Test_Thread( rtems_task_argument value ); + void destructor(void *value); -void *Test_Thread(void *key_value); pthread_key_t Key; volatile bool destructor_ran; @@ -29,32 +30,25 @@ void destructor(void *value) destructor_ran = true; } -void *Test_Thread( - void *key_value -) +rtems_task Test_Thread( rtems_task_argument value ) { - int sc; - - /* - * Detach ourselves so we don't wait for a join that won't happen. - */ - pthread_detach( pthread_self() ); + int sc; + void *key_value = (void *) value; puts( "Test_Thread - pthread_setspecific - OK" ); sc = pthread_setspecific( Key, key_value ); rtems_test_assert( !sc ); puts( "Test_Thread - pthread_exit to run key destructors - OK" ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *POSIX_Init( - void *ignored -) +rtems_task Init(rtems_task_argument ignored) { - pthread_t thread; - int sc; - struct timespec delay_request; + rtems_id thread; + rtems_status_code rc; + int sc; + struct timespec delay_request; puts( "\n\n*** TEST KEY 03 ***" ); @@ -65,9 +59,19 @@ void *POSIX_Init( sc = pthread_key_create( &Key, NULL ); rtems_test_assert( !sc ); - puts( "Init - pthread_create - OK" ); - sc = pthread_create( &thread, NULL, Test_Thread, &sc ); - rtems_test_assert( !sc ); + puts( "Init - create/start - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread, Test_Thread, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); delay_request.tv_sec = 0; @@ -87,9 +91,19 @@ void *POSIX_Init( sc = pthread_key_create( &Key, destructor ); rtems_test_assert( !sc ); - puts( "Init - pthread_create - OK" ); - sc = pthread_create( &thread, NULL, Test_Thread, NULL ); - rtems_test_assert( !sc ); + puts( "Init - task create/start - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread, Test_Thread, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); sc = nanosleep( &delay_request, NULL ); @@ -111,10 +125,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 +#define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey03/psxkey03.scn b/testsuites/psxtests/psxkey03/psxkey03.scn index 739cd35b2e..99c36175af 100644 --- a/testsuites/psxtests/psxkey03/psxkey03.scn +++ b/testsuites/psxtests/psxkey03/psxkey03.scn @@ -1,12 +1,15 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + + *** TEST KEY 03 *** Init - pthread_key_create with NULL destructor - OK -Init - pthread_create - OK +Init - create/start - OK Init - sleep - let thread run - OK Test_Thread - pthread_setspecific - OK Test_Thread - pthread_exit to run key destructors - OK Init - pthread_key_delete - OK Init - pthread_key_create with non-NULL destructor - OK -Init - pthread_create - OK +Init - task create/start - OK Init - sleep - let thread run - OK Test_Thread - pthread_setspecific - OK Test_Thread - pthread_exit to run key destructors - OK diff --git a/testsuites/psxtests/psxkey04/init.c b/testsuites/psxtests/psxkey04/init.c index 76540dd76f..67f0e988a1 100644 --- a/testsuites/psxtests/psxkey04/init.c +++ b/testsuites/psxtests/psxkey04/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 @@ -18,26 +18,20 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); -void *Test_Thread1(void *argument); -void *Test_Thread2(void *argument); +rtems_task Init(rtems_task_argument argument); +rtems_task Test_Thread1(rtems_task_argument argument); +rtems_task Test_Thread2(rtems_task_argument argument); -int Data_array[2] = {1, 2}; -pthread_t thread1, thread2; +int Data_array[2] = {1, 2}; +rtems_id thread1, thread2; pthread_key_t Key; -void *Test_Thread1( - void *argument -) +rtems_task Test_Thread1( rtems_task_argument argument ) { - int sc; - int *value; + 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 - pthread_setspecific - OK" ); sc = pthread_setspecific( Key, &Data_array[0] ); @@ -53,19 +47,13 @@ void *Test_Thread1( value = pthread_getspecific( Key ); rtems_test_assert( *value == Data_array[0] ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *Test_Thread2( - void *argument -) +rtems_task Test_Thread2( rtems_task_argument 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 - pthread_setspecific - OK" ); sc = pthread_setspecific( Key, &Data_array[1] ); @@ -75,15 +63,14 @@ void *Test_Thread2( value = pthread_getspecific( Key ); rtems_test_assert( *value == Data_array[1] ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *POSIX_Init( - void *ignored -) +rtems_task Init( rtems_task_argument ignored ) { - int sc; - struct timespec delay_request; + int sc; + rtems_status_code rc; + struct timespec delay_request; puts( "\n\n*** TEST KEY 04 ***" ); @@ -91,12 +78,32 @@ void *POSIX_Init( sc = pthread_key_create( &Key, NULL ); rtems_test_assert( !sc ); - puts( "Init - pthread_create - OK" ); - sc = pthread_create( &thread1, NULL, Test_Thread1, NULL ); - rtems_test_assert( !sc ); - - sc = pthread_create( &thread2, NULL, Test_Thread2, NULL ); - rtems_test_assert( !sc ); + puts( "Init - create - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread1 + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread1, Test_Thread1, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread2 + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread2, Test_Thread2, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); delay_request.tv_sec = 0; @@ -117,10 +124,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 3 +#define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey04/psxkey04.scn b/testsuites/psxtests/psxkey04/psxkey04.scn index aa0500fcba..d6ab2b35a4 100644 --- a/testsuites/psxtests/psxkey04/psxkey04.scn +++ b/testsuites/psxtests/psxkey04/psxkey04.scn @@ -1,6 +1,9 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + + *** TEST KEY 04 *** Init - pthread_key_create - OK -Init - pthread_create - OK +Init - create - OK Init - sleep - let thread run - OK Test_Thread 1 - pthread_setspecific - OK Test_Thread 1 - sleep - let thread 2 run - OK diff --git a/testsuites/psxtests/psxkey05/init.c b/testsuites/psxtests/psxkey05/init.c index 08d22b0cbd..155a9f5807 100644 --- a/testsuites/psxtests/psxkey05/init.c +++ b/testsuites/psxtests/psxkey05/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 @@ -18,11 +18,9 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init( rtems_task_argument ignored ); -void *POSIX_Init( - void *ignored -) +rtems_task Init( rtems_task_argument ignored ) { pthread_key_t key1, key2; int sc, *value; @@ -69,12 +67,13 @@ void *POSIX_Init( /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 +#define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_MAXIMUM_POSIX_KEYS 2 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey05/psxkey05.scn b/testsuites/psxtests/psxkey05/psxkey05.scn index f352a36785..89127af466 100644 --- a/testsuites/psxtests/psxkey05/psxkey05.scn +++ b/testsuites/psxtests/psxkey05/psxkey05.scn @@ -1,10 +1,13 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + + *** TEST KEY 05 *** Init - pthread key1 create - OK Init - pthread key2 create - OK Init - key1 pthread_setspecific - OK -Init - key1 pthread_getspecific - OK Init - key2 pthread_setspecific - OK +Init - key1 pthread_getspecific - OK Init - key2 pthread_getspecific - OK Init - pthread key1 delete - OK Init - pthread key2 delete - OK -*** END OF TEST KEY 05 ***
\ No newline at end of file +*** END OF TEST KEY 05 *** diff --git a/testsuites/psxtests/psxkey06/init.c b/testsuites/psxtests/psxkey06/init.c index 98b46a42be..baf07cc81c 100644 --- a/testsuites/psxtests/psxkey06/init.c +++ b/testsuites/psxtests/psxkey06/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 @@ -18,25 +18,19 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); -void *Test_Thread1(void *argument); -void *Test_Thread2(void *argument); +rtems_task Init(rtems_task_argument argument); +rtems_task Test_Thread1(rtems_task_argument argument); +rtems_task Test_Thread2(rtems_task_argument argument); int Data_array[4] = {1, 2, 3, 4}; pthread_key_t key1, key2; -void *Test_Thread1( - void *argument -) +rtems_task Test_Thread1( rtems_task_argument 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] ); @@ -60,19 +54,13 @@ void *Test_Thread1( value = pthread_getspecific( key2 ); rtems_test_assert( *value == Data_array[1] ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *Test_Thread2( - void *argument -) +rtems_task Test_Thread2( rtems_task_argument 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] ); @@ -90,16 +78,16 @@ void *Test_Thread2( value = pthread_getspecific( key2 ); rtems_test_assert( *value == Data_array[3] ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *POSIX_Init( - void *ignored -) +rtems_task Init( rtems_task_argument ignored ) { - pthread_t thread1, thread2; - int sc; - struct timespec delay_request; + rtems_id thread1; + rtems_id thread2; + rtems_status_code rc; + int sc; + struct timespec delay_request; puts( "\n\n*** TEST KEY 06 ***" ); @@ -111,13 +99,33 @@ void *POSIX_Init( 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 - thread1 create - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread1 + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread1, Test_Thread1, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + puts( "Init - thread2 create - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread2 + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread2, Test_Thread2, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); delay_request.tv_sec = 0; @@ -142,10 +150,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 3 +#define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_MAXIMUM_POSIX_KEYS 2 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey07/init.c b/testsuites/psxtests/psxkey07/init.c index e911dc77d9..b2aabb7a2b 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 ); + /* unblock all created pthread to let them set key data.*/ pthread_mutex_lock( &mutex2 ); all_thread_created = 1; @@ -128,8 +148,12 @@ void *POSIX_Init( sc = nanosleep( &delay_request, NULL ); rtems_test_assert( !sc ); - printf( "Init - %d pthreads have been got key data - OK\n", got_thread_count ); + 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 ); @@ -137,12 +161,15 @@ void *POSIX_Init( 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 ); @@ -156,16 +183,13 @@ void *POSIX_Init( #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_TASKS 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_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey07/psxkey07.scn b/testsuites/psxtests/psxkey07/psxkey07.scn index 851876fce1..f079a2dc5f 100644 --- a/testsuites/psxtests/psxkey07/psxkey07.scn +++ b/testsuites/psxtests/psxkey07/psxkey07.scn @@ -1,3 +1,4 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run *** TEST KEY 07 *** @@ -6,10 +7,10 @@ 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 - 719 pthreads have been created - OK +Init - 719 pthreads have been setted key data - OK Init - sleep - let threads run - OK -Init - 380 pthreads have been got key data - OK +Init - 719 pthreads have been got key data - OK Init - pthread Key delete - OK Init - Mutex1 delete - OK Init - Mutex2 delete - OK diff --git a/testsuites/psxtests/psxkey08/init.c b/testsuites/psxtests/psxkey08/init.c index 81f4378828..2c74d23c18 100644 --- a/testsuites/psxtests/psxkey08/init.c +++ b/testsuites/psxtests/psxkey08/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 @@ -36,7 +36,6 @@ rtems_task test_task(rtems_task_argument arg) int *value_p, *value_p2; value_p = malloc( sizeof( int ) ); - //printf( "Test_Task%d - Key pthread_setspecific - OK\n", (int)rtems_task_self() ); sc = pthread_setspecific( Key, value_p ); rtems_test_assert( !sc ); ++setted_task_count; @@ -47,12 +46,11 @@ rtems_task test_task(rtems_task_argument arg) */ rtems_semaphore_obtain( sema2 , RTEMS_WAIT, 0 ); - //printf( "Test_Task%d - Key pthread_getspecific - OK\n", (int)rtems_task_self() ); value_p2 = pthread_getspecific( Key ); rtems_test_assert( value_p == value_p2 ); ++got_task_count; - pthread_exit( 0 ); + rtems_task_delete( RTEMS_SELF ); } rtems_task Init(rtems_task_argument arg) @@ -67,54 +65,69 @@ rtems_task Init(rtems_task_argument arg) puts( "Init - Semaphore 1 create - OK" ); name1 = rtems_build_name('S', 'E', 'M', '1'); - sc = rtems_semaphore_create( name1, 0, - RTEMS_SIMPLE_BINARY_SEMAPHORE | - RTEMS_FIFO, - 0, &sema1 ); + sc = rtems_semaphore_create( + name1, 0, + RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, + 0, + &sema1 + ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); puts( "Init - Semaphore 2 create - OK" ); name2 = rtems_build_name('S', 'E', 'M', '2'); - sc = rtems_semaphore_create( name2, 0, - RTEMS_SIMPLE_BINARY_SEMAPHORE | - RTEMS_FIFO, - 0, &sema2 ); + sc = rtems_semaphore_create( + name2, + 0, + RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, + 0, + &sema2 + ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); puts( "Init - pthread Key create - OK" ); sc = pthread_key_create( &Key, NULL ); rtems_test_assert( !sc ); - for( ; ; ) - { - task_id_p = malloc( sizeof( rtems_id ) ); - rtems_test_assert( task_id_p ); - sc = rtems_task_create( - rtems_build_name('T','A',created_task_count, ' '), - 1, - RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES, - task_id_p - ); - rtems_test_assert( (sc == RTEMS_UNSATISFIED) || (sc == RTEMS_TOO_MANY) || (sc == RTEMS_SUCCESSFUL) ); - /** - * when return is RTEMS_TOO_MANY or RTEMS_UNSATISFIED, there is not - * enough source to create task. - */ - if ( (sc == RTEMS_TOO_MANY) || (sc == RTEMS_UNSATISFIED) ) - { - break; - } - ++created_task_count; - sc = rtems_task_start( *task_id_p, test_task, 0 ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); - sc = rtems_semaphore_obtain( sema1, RTEMS_WAIT, 0 ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + for ( ; ; ) { + task_id_p = malloc( sizeof( rtems_id ) ); + rtems_test_assert( task_id_p ); + + sc = rtems_task_create( + rtems_build_name('T','A',created_task_count, ' '), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + task_id_p + ); + rtems_test_assert( + (sc == RTEMS_UNSATISFIED) || + (sc == RTEMS_TOO_MANY) || + (sc == RTEMS_SUCCESSFUL) + ); + + /** + * when return is RTEMS_TOO_MANY or RTEMS_UNSATISFIED, there is not + * enough source to create task. + */ + if ( (sc == RTEMS_TOO_MANY) || (sc == RTEMS_UNSATISFIED) ) { + break; } + ++created_task_count; - printf( "Init - %d tasks have been created - OK\n", created_task_count ); - printf( "Init - %d tasks have been setted key data - OK\n", setted_task_count ); + sc = rtems_task_start( *task_id_p, test_task, 0 ); + rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + + sc = rtems_semaphore_obtain( sema1, RTEMS_WAIT, 0 ); + rtems_test_assert( sc == RTEMS_SUCCESSFUL ); + } + + printf( + "Init - %d tasks have been created - OK\n" + "Init - %d tasks have been setted key data - OK\n", + setted_task_count, + created_task_count + ); rtems_test_assert( created_task_count == setted_task_count ); /* unblock all created tasks to let them set key data.*/ @@ -146,7 +159,7 @@ rtems_task Init(rtems_task_argument arg) /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER #define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(5) #define CONFIGURE_MAXIMUM_SEMAPHORES 2 diff --git a/testsuites/psxtests/psxkey08/psxkey08.scn b/testsuites/psxtests/psxkey08/psxkey08.scn index a4f1be4959..64f23f8829 100644 --- a/testsuites/psxtests/psxkey08/psxkey08.scn +++ b/testsuites/psxtests/psxkey08/psxkey08.scn @@ -1,14 +1,15 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run *** TEST KEY 08 *** Init - Semaphore 1 create - OK Init - Semaphore 2 create - OK Init - pthread Key create - OK -Init - 651 tasks have been created - OK -Init - 651 tasks have been setted key data - OK +Init - 720 tasks have been created - OK +Init - 720 tasks have been setted key data - OK Init - flush semaphore 2 - OK Init - sleep to yield processor - OK -Init - 651 Tasks have been got key data - OK +Init - 720 Tasks have been got key data - OK Init - pthread Key delete - OK Init - semaphore 1 delete - OK Init - semaphore 2 delete - OK diff --git a/testsuites/psxtests/psxkey09/init.c b/testsuites/psxtests/psxkey09/init.c index a44f0e36ca..9aa5e73efb 100644 --- a/testsuites/psxtests/psxkey09/init.c +++ b/testsuites/psxtests/psxkey09/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,9 +19,9 @@ /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init(rtems_task_argument argument); +rtems_task Test_Thread(rtems_task_argument argument); void destructor(void *value); -void *Test_Thread(void *argument); int Data_array[1] = {1}; @@ -33,32 +33,25 @@ void destructor(void *value) destructor_ran = true; } -void *Test_Thread( - void *argument -) +rtems_task Test_Thread( rtems_task_argument arg ) { - int sc; - - /** - * Detach ourselves to release test thread's resource after thread exit. - */ - pthread_detach( pthread_self() ); + void *argument = (void *)arg; + int sc; puts( "Test_Thread - key pthread_setspecific - OK" ); sc = pthread_setspecific( key, argument ); rtems_test_assert( !sc ); puts( "Test_Thread - pthread_exit to run key destructors - OK" ); - return NULL; + rtems_task_delete( RTEMS_SELF ); } -void *POSIX_Init( - void *ignored -) +rtems_task Init( rtems_task_argument ignored ) { - pthread_t thread; - int sc; - struct timespec delay_request; + rtems_id thread; + rtems_status_code rc; + int sc; + struct timespec delay_request; puts( "\n\n*** TEST KEY 09 ***" ); @@ -66,9 +59,19 @@ void *POSIX_Init( sc = pthread_key_create( &key, destructor ); rtems_test_assert( !sc ); - puts( "Init - pthread create - OK" ); - sc = pthread_create( &thread, NULL, Test_Thread, &sc ); - rtems_test_assert( !sc ); + puts( "Init - thread create - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread, Test_Thread, (rtems_task_argument)Data_array ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); delay_request.tv_sec = 0; @@ -92,10 +95,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 +#define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey09/psxkey09.scn b/testsuites/psxtests/psxkey09/psxkey09.scn index 707c7d63b1..6ed6bd309a 100644 --- a/testsuites/psxtests/psxkey09/psxkey09.scn +++ b/testsuites/psxtests/psxkey09/psxkey09.scn @@ -1,6 +1,9 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + + *** TEST KEY 09 *** Init - pthread key create with destructor - OK -Init - pthread create - OK +Init - thread create - OK Init - sleep - let thread run - OK Test_Thread - key pthread_setspecific - OK Test_Thread - pthread_exit to run key destructors - OK diff --git a/testsuites/psxtests/psxkey10/init.c b/testsuites/psxtests/psxkey10/init.c index eee0c18d8d..edbf6c375c 100644 --- a/testsuites/psxtests/psxkey10/init.c +++ b/testsuites/psxtests/psxkey10/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 @@ -18,9 +18,10 @@ #include "pmacros.h" /* forward declarations to avoid warnings */ -void *POSIX_Init(void *argument); +rtems_task Init(rtems_task_argument argument); +rtems_task Test_Thread(rtems_task_argument argument); + void destructor(void *value); -void *Test_Thread(void *argument); int Data_array[1] = {1}; @@ -32,17 +33,11 @@ void destructor(void *value) destructor_ran = true; } -void *Test_Thread( - void *argument -) +rtems_task Test_Thread( rtems_task_argument arg ) { + void *argument = (void *) arg; int sc; - /** - * Detach ourselves to release test thread's resource after thread exit. - */ - pthread_detach( pthread_self() ); - puts( "Test_Thread - key pthread_setspecific - OK" ); sc = pthread_setspecific( key, argument ); rtems_test_assert( !sc ); @@ -51,17 +46,16 @@ void *Test_Thread( sc = pthread_key_delete( key ); rtems_test_assert( sc == 0 ); - puts( "Test_Thread - pthread exit, but don't run key destructors - OK" ); - return NULL; + puts( "Test_Thread - exit but don't run key destructors - OK" ); + rtems_task_delete( RTEMS_SELF ); } -void *POSIX_Init( - void *ignored -) +rtems_task Init( rtems_task_argument ignored ) { - pthread_t thread; - int sc; - struct timespec delay_request; + rtems_id thread; + rtems_status_code rc; + int sc; + struct timespec delay_request; puts( "\n\n*** TEST KEY 10 ***" ); @@ -69,9 +63,19 @@ void *POSIX_Init( sc = pthread_key_create( &key, destructor ); rtems_test_assert( !sc ); - puts( "Init - pthread create - OK" ); - sc = pthread_create( &thread, NULL, Test_Thread, &sc ); - rtems_test_assert( !sc ); + puts( "Init - thread create - OK" ); + rc = rtems_task_create( + rtems_build_name( 'T', 'E', 'S', 'T' ), + 1, + RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &thread + ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); + + rc = rtems_task_start( thread, Test_Thread, 0 ); + rtems_test_assert( rc == RTEMS_SUCCESSFUL ); puts( "Init - sleep - let thread run - OK" ); delay_request.tv_sec = 0; @@ -95,10 +99,10 @@ void *POSIX_Init( #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_POSIX_THREADS 2 +#define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_POSIX_KEYS 1 -#define CONFIGURE_POSIX_INIT_THREAD_TABLE +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT #include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxkey10/psxkey10.scn b/testsuites/psxtests/psxkey10/psxkey10.scn index 98940e24ad..10c403057d 100644 --- a/testsuites/psxtests/psxkey10/psxkey10.scn +++ b/testsuites/psxtests/psxkey10/psxkey10.scn @@ -1,10 +1,12 @@ +sparc-rtems4.11-run is /home/joel/rtems-4.11-work/tools/bin/sparc-rtems4.11-run + *** TEST KEY 10 *** Init - pthread key create with destructor - OK -Init - pthread create - OK +Init - thread create - OK Init - sleep - let thread run - OK Test_Thread - key pthread_setspecific - OK Test_Thread - pthread key delete - OK -Test_Thread - pthread exit, but don't run key destructors - OK +Test_Thread - exit but don't run key destructors - OK Init - verify destructor did NOT run - OK *** END OF TEST KEY 10 *** |