source: rtems/cpukit/posix/src/keysetspecific.c @ 40dcafa

4.115
Last change on this file since 40dcafa was 40dcafa, checked in by Sebastian Huber <sebastian.huber@…>, on 08/02/14 at 14:22:31

Add and use RTEMS_CONTAINER_OF()

  • Property mode set to 100644
File size: 2.2 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
43  the_key = _POSIX_Keys_Get( key, &location );
44  switch ( location ) {
45
46    case OBJECTS_LOCAL:
47      p = _POSIX_Keys_Find( key, _Thread_Executing->Object.id, &search_node );
48      if ( p != NULL ) {
49        value_pair_ptr = POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( p );
50        value_pair_ptr->value = value;
51      } else {
52        value_pair_ptr = _POSIX_Keys_Key_value_pair_allocate();
53
54        if ( !value_pair_ptr ) {
55          _Objects_Put( &the_key->Object );
56
57          return ENOMEM;
58        }
59
60        value_pair_ptr->key = key;
61        value_pair_ptr->thread_id = _Thread_Executing->Object.id;
62        value_pair_ptr->value = value;
63        /* The insert can only go wrong if the same node is already in a unique
64         * tree. This has been already checked with the _RBTree_Find() */
65        _RBTree_Insert(
66          &_POSIX_Keys_Key_value_lookup_tree,
67          &value_pair_ptr->Key_value_lookup_node,
68          _POSIX_Keys_Key_value_compare,
69          true
70        );
71
72        /** append rb_node to the thread API extension's chain */
73        _Chain_Append_unprotected(
74          &_Thread_Executing->Key_Chain,
75          &value_pair_ptr->Key_values_per_thread_node
76        );
77      }
78
79      _Objects_Put( &the_key->Object );
80
81      return 0;
82
83#if defined(RTEMS_MULTIPROCESSING)
84    case OBJECTS_REMOTE:   /* should never happen */
85#endif
86    case OBJECTS_ERROR:
87      break;
88  }
89
90  return EINVAL;
91}
Note: See TracBrowser for help on using the repository browser.