diff options
Diffstat (limited to 'cpukit/posix/src/keycreate.c')
-rw-r--r-- | cpukit/posix/src/keycreate.c | 42 |
1 files changed, 26 insertions, 16 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; |