Changeset 172e953 in rtems


Ignore:
Timestamp:
Dec 12, 2014, 12:16:11 PM (5 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, master
Children:
7bdb765
Parents:
dac340dd
git-author:
Sebastian Huber <sebastian.huber@…> (12/12/14 12:16:11)
git-committer:
Sebastian Huber <sebastian.huber@…> (12/12/14 12:16:25)
Message:

posix: Delete key/value if value is set to NULL

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • cpukit/posix/include/rtems/posix/keyimpl.h

    rdac340dd r172e953  
    1818
    1919#include <rtems/posix/key.h>
     20#include <rtems/score/chainimpl.h>
    2021#include <rtems/score/freechain.h>
    2122#include <rtems/score/objectimpl.h>
     
    187188}
    188189
     190RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free_key_value_pair(
     191  POSIX_Keys_Key_value_pair *key_value_pair
     192)
     193{
     194  _RBTree_Extract(
     195    &_POSIX_Keys_Key_value_lookup_tree,
     196    &key_value_pair->Key_value_lookup_node
     197  );
     198  _Chain_Extract_unprotected( &key_value_pair->Key_values_per_thread_node );
     199  _POSIX_Keys_Key_value_pair_free( key_value_pair );
     200}
     201
    189202/** @} */
    190203
  • cpukit/posix/src/keyfreememory.c

    rdac340dd r172e953  
    5252  while ( iter != NULL && p->key == key_id ) {
    5353    next = _RBTree_Next( iter, RBT_RIGHT );
    54     _RBTree_Extract( &_POSIX_Keys_Key_value_lookup_tree, iter );
    55     _Chain_Extract_unprotected( &p->Key_values_per_thread_node );
    56     _POSIX_Keys_Key_value_pair_free( p );
     54
     55    _POSIX_Keys_Free_key_value_pair( p );
    5756
    5857    iter = next;
  • cpukit/posix/src/keysetspecific.c

    rdac340dd r172e953  
    2626#include <errno.h>
    2727
     28static int _POSIX_Keys_Set_value(
     29  pthread_key_t       key,
     30  const void         *value,
     31  POSIX_Keys_Control *the_key,
     32  Thread_Control     *executing,
     33  RBTree_Node        *rb_node
     34)
     35{
     36  POSIX_Keys_Key_value_pair *key_value_pair;
     37
     38  if ( rb_node != NULL ) {
     39    key_value_pair = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( rb_node );
     40    key_value_pair->value = RTEMS_DECONST( void *, value );
     41  } else {
     42    key_value_pair = _POSIX_Keys_Key_value_pair_allocate();
     43
     44    if ( key_value_pair == NULL ) {
     45      return ENOMEM;
     46    }
     47
     48    key_value_pair->key = key;
     49    key_value_pair->thread = executing;
     50    key_value_pair->value = RTEMS_DECONST( void *, value );
     51
     52    /*
     53     * The insert can only go wrong if the same node is already in a unique
     54     * tree.  This has been already checked with the _RBTree_Find().
     55     */
     56    _RBTree_Insert(
     57      &_POSIX_Keys_Key_value_lookup_tree,
     58      &key_value_pair->Key_value_lookup_node,
     59      _POSIX_Keys_Key_value_compare,
     60      true
     61    );
     62
     63    _Chain_Append_unprotected(
     64      &executing->Key_Chain,
     65      &key_value_pair->Key_values_per_thread_node
     66    );
     67  }
     68
     69  return 0;
     70}
     71
     72static int _POSIX_Keys_Delete_value(
     73  pthread_key_t       key,
     74  POSIX_Keys_Control *the_key,
     75  RBTree_Node        *rb_node
     76)
     77{
     78
     79  if ( rb_node != NULL ) {
     80    POSIX_Keys_Key_value_pair *key_value_pair =
     81      POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( rb_node );
     82
     83    _POSIX_Keys_Free_key_value_pair( key_value_pair );
     84  }
     85
     86  return 0;
     87}
     88
    2889/*
    2990 *  17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
     
    3596)
    3697{
    37   POSIX_Keys_Control          *the_key;
    38   Objects_Locations            location;
    39   POSIX_Keys_Key_value_pair   *value_pair_ptr;
    40   RBTree_Node                 *p;
    41   Thread_Control              *executing;
     98  POSIX_Keys_Control *the_key;
     99  Objects_Locations   location;
     100  Thread_Control     *executing;
     101  RBTree_Node        *rb_node;
     102  int                 eno;
    42103
    43104  the_key = _POSIX_Keys_Get( key, &location );
     
    46107    case OBJECTS_LOCAL:
    47108      executing = _Thread_Executing;
    48       p = _POSIX_Keys_Find( key, executing );
    49       if ( p != NULL ) {
    50         value_pair_ptr = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( p );
    51         value_pair_ptr->value = RTEMS_DECONST( void *, value );
     109      rb_node = _POSIX_Keys_Find( key, executing );
     110
     111      if ( value != NULL ) {
     112        eno = _POSIX_Keys_Set_value( key, value, the_key, executing, rb_node );
    52113      } else {
    53         value_pair_ptr = _POSIX_Keys_Key_value_pair_allocate();
    54 
    55         if ( !value_pair_ptr ) {
    56           _Objects_Put( &the_key->Object );
    57 
    58           return ENOMEM;
    59         }
    60 
    61         value_pair_ptr->key = key;
    62         value_pair_ptr->thread = executing;
    63         value_pair_ptr->value = RTEMS_DECONST( void *, value );
    64         /* The insert can only go wrong if the same node is already in a unique
    65          * tree. This has been already checked with the _RBTree_Find() */
    66         _RBTree_Insert(
    67           &_POSIX_Keys_Key_value_lookup_tree,
    68           &value_pair_ptr->Key_value_lookup_node,
    69           _POSIX_Keys_Key_value_compare,
    70           true
    71         );
    72 
    73         /** append rb_node to the thread API extension's chain */
    74         _Chain_Append_unprotected(
    75           &_Thread_Executing->Key_Chain,
    76           &value_pair_ptr->Key_values_per_thread_node
    77         );
     114        eno = _POSIX_Keys_Delete_value( key, the_key, rb_node );
    78115      }
    79116
    80117      _Objects_Put( &the_key->Object );
    81118
    82       return 0;
     119      return eno;
    83120
    84121#if defined(RTEMS_MULTIPROCESSING)
  • testsuites/psxtests/psxkey02/init.c

    rdac340dd r172e953  
    3131  rtems_resource_snapshot snapshot;
    3232  void                   *greedy;
     33  void                   *value;
    3334
    3435  TEST_BEGIN();
     
    4041  eno = pthread_key_create( &key1, NULL );
    4142  rtems_test_assert( eno == 0 );
     43
     44  eno = pthread_setspecific( key1, (void *) 1 );
     45  rtems_test_assert( eno == 0 );
     46
     47  value = pthread_getspecific( key1 );
     48  rtems_test_assert( value == (void *) 1 );
     49
     50  eno = pthread_setspecific( key1, NULL );
     51  rtems_test_assert( eno == 0 );
     52
     53  value = pthread_getspecific( key1 );
     54  rtems_test_assert( value == NULL );
     55
     56  eno = pthread_setspecific( key1, NULL );
     57  rtems_test_assert( eno == 0 );
     58
     59  value = pthread_getspecific( key1 );
     60  rtems_test_assert( value == NULL );
    4261
    4362  puts( "Init - pthread_key_create - EAGAIN" );
Note: See TracChangeset for help on using the changeset viewer.