source: rtems/cpukit/posix/src/keysetspecific.c @ 390cfcd

4.115
Last change on this file since 390cfcd was 390cfcd, checked in by Sebastian Huber <sebastian.huber@…>, on 08/02/14 at 13:49:26

posix: Simplify key implementation

  • Property mode set to 100644
File size: 2.3 KB
Line 
1/**
2 * @file
3 *
4 * @brief Set Specific Key
5 * @ingroup POSIXAPI
6 */
7
8/*
9 * Copyright (c) 2012 Zhongwei Yao.
10 * COPYRIGHT (c) 1989-2014.
11 * On-Line Applications Research Corporation (OAR).
12 *
13 * The license and distribution terms for this file may be
14 * found in the file LICENSE in this distribution or at
15 * http://www.rtems.org/license/LICENSE.
16 */
17
18#if HAVE_CONFIG_H
19#include "config.h"
20#endif
21
22#include <rtems/posix/keyimpl.h>
23#include <rtems/score/thread.h>
24#include <rtems/score/chainimpl.h>
25
26#include <errno.h>
27
28/*
29 *  17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
30 */
31
32int pthread_setspecific(
33  pthread_key_t  key,
34  const void    *value
35)
36{
37  POSIX_Keys_Control          *the_key;
38  Objects_Locations            location;
39  POSIX_Keys_Key_value_pair   *value_pair_ptr;
40  RBTree_Node                 *p;
41  POSIX_Keys_Key_value_pair    search_node;
42  Thread_Control              *executing;
43
44  the_key = _POSIX_Keys_Get( key, &location );
45  switch ( location ) {
46
47    case OBJECTS_LOCAL:
48      executing = _Thread_Executing;
49      p = _POSIX_Keys_Find( key, executing, &search_node );
50      if ( p != NULL ) {
51        value_pair_ptr = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( p );
52        value_pair_ptr->value = value;
53      } else {
54        value_pair_ptr = _POSIX_Keys_Key_value_pair_allocate();
55
56        if ( !value_pair_ptr ) {
57          _Objects_Put( &the_key->Object );
58
59          return ENOMEM;
60        }
61
62        value_pair_ptr->key = key;
63        value_pair_ptr->thread = executing;
64        value_pair_ptr->value = value;
65        /* The insert can only go wrong if the same node is already in a unique
66         * tree. This has been already checked with the _RBTree_Find() */
67        _RBTree_Insert(
68          &_POSIX_Keys_Key_value_lookup_tree,
69          &value_pair_ptr->Key_value_lookup_node,
70          _POSIX_Keys_Key_value_compare,
71          true
72        );
73
74        /** append rb_node to the thread API extension's chain */
75        _Chain_Append_unprotected(
76          &_Thread_Executing->Key_Chain,
77          &value_pair_ptr->Key_values_per_thread_node
78        );
79      }
80
81      _Objects_Put( &the_key->Object );
82
83      return 0;
84
85#if defined(RTEMS_MULTIPROCESSING)
86    case OBJECTS_REMOTE:   /* should never happen */
87#endif
88    case OBJECTS_ERROR:
89      break;
90  }
91
92  return EINVAL;
93}
Note: See TracBrowser for help on using the repository browser.