diff options
Diffstat (limited to 'include/rtems/posix/keyimpl.h')
-rw-r--r-- | include/rtems/posix/keyimpl.h | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/include/rtems/posix/keyimpl.h b/include/rtems/posix/keyimpl.h new file mode 100644 index 0000000000..6fd4d1348a --- /dev/null +++ b/include/rtems/posix/keyimpl.h @@ -0,0 +1,205 @@ +/** + * @file + * + * @brief Private Inlined Routines for POSIX Key's + * + * This include file contains the static inline implementation of the private + * inlined routines for POSIX key's. + */ + +/* + * COPYRIGHT (c) 1989-1999. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include <rtems/posix/key.h> +#include <rtems/score/chainimpl.h> +#include <rtems/score/freechain.h> +#include <rtems/score/objectimpl.h> +#include <rtems/score/percpu.h> + +#ifndef _RTEMS_POSIX_KEYIMPL_H +#define _RTEMS_POSIX_KEYIMPL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup POSIX_KEY + * + * @{ + */ + +/** + * @brief The information control block used to manage this class of objects. + */ +POSIX_EXTERN Objects_Information _POSIX_Keys_Information; + +/** + * @brief The rbtree control block used to manage all key values + */ +extern RBTree_Control _POSIX_Keys_Key_value_lookup_tree; + +/** + * @brief This freechain is used as a memory pool for POSIX_Keys_Key_value_pair. + */ +POSIX_EXTERN Freechain_Control _POSIX_Keys_Keypool; + +#define POSIX_KEYS_RBTREE_NODE_TO_KEY_VALUE_PAIR( node ) \ + RTEMS_CONTAINER_OF( node, POSIX_Keys_Key_value_pair, Key_value_lookup_node ) + +/** + * @brief POSIX key manager initialization. + * + * This routine performs the initialization necessary for this manager. + */ +void _POSIX_Key_Manager_initialization(void); + +/** + * @brief POSIX keys Red-Black tree node comparison. + * + * This routine compares the rbtree node + */ +RBTree_Compare_result _POSIX_Keys_Key_value_compare( + const RBTree_Node *node1, + const RBTree_Node *node2 +); + +/** + * @brief Create thread-specific data POSIX key. + * + * This function executes all the destructors associated with the thread's + * keys. This function will execute until all values have been set to NULL. + * + * @param[in] thread is a pointer to the thread whose keys should have + * all their destructors run. + * + * NOTE: This is the routine executed when a thread exits to + * run through all the keys and do the destructor action. + */ +void _POSIX_Keys_Run_destructors( + Thread_Control *thread +); + +/** + * @brief Free a POSIX key table memory. + * + * This memory frees the key table memory associated with @a the_key. + * + * @param[in] the_key is a pointer to the POSIX key to free + * the table memory of. + */ +void _POSIX_Keys_Free_memory( + POSIX_Keys_Control *the_key +); + +/** + * @brief Free a POSIX keys control block. + * + * This routine frees a keys control block to the + * inactive chain of free keys control blocks. + * + * @param[in] the_key is a pointer to the POSIX key to free. + */ +RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free ( + POSIX_Keys_Control *the_key +); + +/** + * @brief Allocate a keys control block. + * + * This function allocates a keys control block from + * the inactive chain of free keys control blocks. + */ + +RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void ) +{ + return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information ); +} + +/** + * @brief Free a keys control block. + * + * This routine frees a keys control block to the + * inactive chain of free keys control blocks. + */ +RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free ( + POSIX_Keys_Control *the_key +) +{ + _Objects_Free( &_POSIX_Keys_Information, &the_key->Object ); +} + +/** + * @brief Get a keys control block. + * + * This function maps key IDs to key control blocks. + * If ID corresponds to a local keys, then it returns + * the_key control pointer which maps to ID and location + * is set to OBJECTS_LOCAL. if the keys ID is global and + * resides on a remote node, then location is set to OBJECTS_REMOTE, + * and the_key is undefined. Otherwise, location is set + * to OBJECTS_ERROR and the_key is undefined. + */ + +RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get ( + pthread_key_t id, + Objects_Locations *location +) +{ + return (POSIX_Keys_Control *) + _Objects_Get( &_POSIX_Keys_Information, (Objects_Id) id, location ); +} + +POSIX_Keys_Key_value_pair * _POSIX_Keys_Key_value_pair_allocate( void ); + +RTEMS_INLINE_ROUTINE void _POSIX_Keys_Key_value_pair_free( + POSIX_Keys_Key_value_pair *key_value_pair +) +{ + _Freechain_Put( &_POSIX_Keys_Keypool, key_value_pair ); +} + +RTEMS_INLINE_ROUTINE RBTree_Node *_POSIX_Keys_Find( + pthread_key_t key, + Thread_Control *thread +) +{ + POSIX_Keys_Key_value_pair search_node; + + search_node.key = key; + search_node.thread = thread; + + return _RBTree_Find( + &_POSIX_Keys_Key_value_lookup_tree, + &search_node.Key_value_lookup_node, + _POSIX_Keys_Key_value_compare, + true + ); +} + +RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free_key_value_pair( + POSIX_Keys_Key_value_pair *key_value_pair +) +{ + _RBTree_Extract( + &_POSIX_Keys_Key_value_lookup_tree, + &key_value_pair->Key_value_lookup_node + ); + _Chain_Extract_unprotected( &key_value_pair->Key_values_per_thread_node ); + _POSIX_Keys_Key_value_pair_free( key_value_pair ); +} + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ |