From 70af0ea116d8c7cc3b2660b7b573b71155058459 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 10 Jan 2000 18:47:58 +0000 Subject: 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. --- cpukit/posix/src/keycreate.c | 42 ++++++++++++++++++++++++++---------------- cpukit/posix/src/keydelete.c | 3 ++- 2 files changed, 28 insertions(+), 17 deletions(-) (limited to 'cpukit/posix') 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 -- cgit v1.2.3