diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-08-06 15:41:44 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-08-06 15:49:34 +0200 |
commit | b45b0ff7832361bbbccb5bb0006c9755139a9d30 (patch) | |
tree | 5714fd619e1a337e0b89e2fadebf08d0056e75f1 | |
parent | posix: Create key implementation header (diff) | |
download | rtems-b45b0ff7832361bbbccb5bb0006c9755139a9d30.tar.bz2 |
posix: Use _Objects_Put() for POSIX keys
-rw-r--r-- | cpukit/posix/src/keygetspecific.c | 7 | ||||
-rw-r--r-- | cpukit/posix/src/keyrundestructors.c | 6 | ||||
-rw-r--r-- | cpukit/posix/src/keysetspecific.c | 12 |
3 files changed, 15 insertions, 10 deletions
diff --git a/cpukit/posix/src/keygetspecific.c b/cpukit/posix/src/keygetspecific.c index 568a98cf71..011917b325 100644 --- a/cpukit/posix/src/keygetspecific.c +++ b/cpukit/posix/src/keygetspecific.c @@ -38,13 +38,14 @@ void *pthread_getspecific( pthread_key_t key ) { + POSIX_Keys_Control *the_key; Objects_Locations location; POSIX_Keys_Key_value_pair search_node; RBTree_Node *p; void *key_data; POSIX_Keys_Key_value_pair *value_pair_p; - _POSIX_Keys_Get( key, &location ); + the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { case OBJECTS_LOCAL: @@ -62,7 +63,9 @@ void *pthread_getspecific( /* Key_value_lookup_node )->value; */ key_data = value_pair_p->value; } - _Thread_Enable_dispatch(); + + _Objects_Put( &the_key->Object ); + return key_data; #if defined(RTEMS_MULTIPROCESSING) diff --git a/cpukit/posix/src/keyrundestructors.c b/cpukit/posix/src/keyrundestructors.c index d151f4f5ae..078f8f6e64 100644 --- a/cpukit/posix/src/keyrundestructors.c +++ b/cpukit/posix/src/keyrundestructors.c @@ -75,10 +75,8 @@ void _POSIX_Keys_Run_destructors( value = ((POSIX_Keys_Key_value_pair *)iter)->value; if ( destructor != NULL && value != NULL ) (*destructor)( value ); - /** - * disable dispatch is nested here - */ - _Thread_Enable_dispatch(); + + _Objects_Put( &the_key->Object ); /** * put back this node to keypool diff --git a/cpukit/posix/src/keysetspecific.c b/cpukit/posix/src/keysetspecific.c index 4a1adb68b5..ee718a4a03 100644 --- a/cpukit/posix/src/keysetspecific.c +++ b/cpukit/posix/src/keysetspecific.c @@ -34,18 +34,20 @@ int pthread_setspecific( const void *value ) { + POSIX_Keys_Control *the_key; Objects_Locations location; POSIX_Keys_Key_value_pair *value_pair_ptr; POSIX_API_Control *api; - _POSIX_Keys_Get( key, &location ); + the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { case OBJECTS_LOCAL: value_pair_ptr = ( POSIX_Keys_Key_value_pair * ) _Freechain_Get( &_POSIX_Keys_Keypool.super_fc ); if ( !value_pair_ptr ) { - _Thread_Enable_dispatch(); + _Objects_Put( &the_key->Object ); + return ENOMEM; } @@ -56,7 +58,8 @@ int pthread_setspecific( &(value_pair_ptr->Key_value_lookup_node) ) ) { _Freechain_Put( (Freechain_Control *)&_POSIX_Keys_Keypool, (void *) value_pair_ptr ); - _Thread_Enable_dispatch(); + _Objects_Put( &the_key->Object ); + return EAGAIN; } @@ -65,7 +68,8 @@ int pthread_setspecific( (_Thread_Executing->API_Extensions[THREAD_API_POSIX]); _Chain_Append_unprotected( &api->Key_Chain, &value_pair_ptr->Key_values_per_thread_node ); - _Thread_Enable_dispatch(); + _Objects_Put( &the_key->Object ); + return 0; #if defined(RTEMS_MULTIPROCESSING) |