diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-01-10 18:47:58 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2000-01-10 18:47:58 +0000 |
commit | 70af0ea116d8c7cc3b2660b7b573b71155058459 (patch) | |
tree | e742eb37051f8a37c78052c8450b8792ade7d4cf /cpukit/posix | |
parent | Patch rtems-rc-20000104-14.diff from Ralf Corsepius <corsepiu@faw.uni-ulm.de> (diff) | |
download | rtems-70af0ea116d8c7cc3b2660b7b573b71155058459.tar.bz2 |
Don't look at the object information structure for threads/tasks
for APIs that are not configured. This resulted in weird behavior
when ITRON was disabled on some targets.
Diffstat (limited to 'cpukit/posix')
-rw-r--r-- | cpukit/posix/src/keycreate.c | 42 | ||||
-rw-r--r-- | cpukit/posix/src/keydelete.c | 3 |
2 files changed, 28 insertions, 17 deletions
diff --git a/cpukit/posix/src/keycreate.c b/cpukit/posix/src/keycreate.c index da6b4d40af..f5409b31e9 100644 --- a/cpukit/posix/src/keycreate.c +++ b/cpukit/posix/src/keycreate.c @@ -39,28 +39,38 @@ int pthread_key_create( the_key->destructor = destructor; + /* + * This is a bit more complex than one might initially expect because + * APIs are optional. Thus there may be no ITRON tasks to have keys + * for. [NOTE: Currently RTEMS Classic API tasks are not always enabled.] + */ + for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS; the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS; the_class++ ) { - bytes_to_allocate = - (_Objects_Information_table[ the_class ]->maximum + 1) * sizeof( void * ); - - table = _Workspace_Allocate( bytes_to_allocate ); - - if ( !table ) { - for ( --the_class; - the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS; - the_class-- ) - _Workspace_Free( the_key->Values[ the_class ] ); - - _POSIX_Keys_Free( the_key ); - _Thread_Enable_dispatch(); - return ENOMEM; + if ( _Objects_Information_table[ the_class ] ) { + bytes_to_allocate = sizeof( void * ) * + (_Objects_Information_table[ the_class ]->maximum + 1); + table = _Workspace_Allocate( bytes_to_allocate ); + if ( !table ) { + for ( --the_class; + the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS; + the_class-- ) + _Workspace_Free( the_key->Values[ the_class ] ); + + _POSIX_Keys_Free( the_key ); + _Thread_Enable_dispatch(); + return ENOMEM; + } + + the_key->Values[ the_class ] = table; + memset( table, '\0', bytes_to_allocate ); + } else { + the_key->Values[ the_class ] = NULL; } - the_key->Values[ the_class ] = table; - memset( table, '\0', bytes_to_allocate ); + } the_key->is_active = TRUE; diff --git a/cpukit/posix/src/keydelete.c b/cpukit/posix/src/keydelete.c index af012e3638..5d4c93ab1d 100644 --- a/cpukit/posix/src/keydelete.c +++ b/cpukit/posix/src/keydelete.c @@ -38,7 +38,8 @@ int pthread_key_delete( for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS; the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS; the_class++ ) - _Workspace_Free( the_key->Values[ the_class ] ); + if ( the_key->Values[ the_class ] ) + _Workspace_Free( the_key->Values[ the_class ] ); /* * NOTE: The destructor is not called and it is the responsibility |