Hello Ashi,
thanks for your update.
On 2013-07-31 15:03, Ashi wrote:
diff --git a/cpukit/posix/include/rtems/posix/config.h
b/cpukit/posix/include/rtems/posix/config.h
index 104bd84..2c76cc1 100644
--- a/cpukit/posix/include/rtems/posix/config.h
+++ b/cpukit/posix/include/rtems/posix/config.h
@@ -51,6 +51,7 @@ typedef struct {
uint32_t maximum_mutexes;
uint32_t maximum_condition_variables;
uint32_t maximum_keys;
+ uint32_t maximum_key_pairs;
I would call this maximum_key_value_pairs.
uint32_t maximum_timers;
uint32_t maximum_queued_signals;
uint32_t maximum_message_queues;
diff --git a/cpukit/posix/include/rtems/posix/key.h
b/cpukit/posix/include/rtems/posix/key.h
index 6d2ebff..d2c51bd 100644
--- a/cpukit/posix/include/rtems/posix/key.h
+++ b/cpukit/posix/include/rtems/posix/key.h
@@ -1,6 +1,6 @@
/**
* @file
- *
+ *
* @brief POSIX Key Private Support
*
* This include file contains all the private support information for
@@ -8,24 +8,30 @@
*/
/*
- * COPYRIGHT (c) 1989-2011.
- * On-Line Applications Research Corporation (OAR).
+ * Copyright (c) 2012 Zhongwei Yao.
+ * COPYRIGHT (c) 1989-2011.
+ * 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.com/license/LICENSE.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *http://www.rtems.com/license/LICENSE.
*/
#ifndef _RTEMS_POSIX_KEY_H
#define _RTEMS_POSIX_KEY_H
+#include <rtems/score/object.h>
+#include <rtems/score/rbtree.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/chainimpl.h>
+#include <rtems/score/freechain.h>
#include <rtems/score/objectimpl.h>
The xyzimpl.h files include the zyz.h files. So the object.h and chain.h
includes are superfluous.
/**
* @defgroup POSIX_KEY POSIX Key
*
* @ingroup POSIXAPI
- *
+ *
*/
/**@{**/
@@ -34,40 +40,93 @@ extern "C" {
#endif
/**
- * This is the data Structure used to manage a POSIX key.
- *
- * NOTE: The Values is a table indexed by the index portion of the
- * ID of the currently executing thread.
+ * Forward declaretion
+ */
+typedef struct POSIX_Keys_Freechain_node_struct POSIX_Keys_Freechain_node;
+
+/**
+ * @brief The rbtree node used to manage a POSIX key and value.
+ */
+typedef struct {
+ /** This field is the chain node structure. */
+ Chain_Node ch_node;
+ /** This field is the rbtree node structure. */
+ RBTree_Node rb_node;
It would be nice to have field names that describe the purpose of the nodes,
e.g. Key_values_per_thread_node and Key_value_lookup_node.
+ /** This field points to parent freechain node */
+ POSIX_Keys_Freechain_node *fc_node_ptr;
I don't think we need this fc_node_ptr.
+ /** This field is the POSIX key used as an rbtree key */
+ pthread_key_t key;
+ /** This field is the Thread id also used as an rbtree key */
+ Objects_Id thread_id;
+ /** This field points to the POSIX key value of specific thread */
+ void *value;
+} POSIX_Keys_Rbtree_node;
I would call this POSIX_Keys_Key_value_pair.
+
+/**
+ * @brief POSIX_Keys_Freechain is used in Freechain structure
+ */
+typedef struct {
+ Freechain_Control super_fc;
+ size_t bump_count;
+} POSIX_Keys_Freechain;
+
+/**
+ * @brief POSIX_Keys_Freechain_node is freechain node
+ */
+struct POSIX_Keys_Freechain_node_struct {
+ Chain_Node ch_node;
+ POSIX_Keys_Rbtree_node rb_node;
+};
Why not use POSIX_Keys_Rbtree_node directly?
+
+/**
+ * @brief The data structure used to manage a POSIX key.
*/
typedef struct {
/** This field is the Object control structure. */
Objects_Control Object;
- /** This field points to the optional destructor method. */
- void (*destructor)( void * );
- /** This field points to the values per thread. */
- void **Values[ OBJECTS_APIS_LAST + 1 ];
-} POSIX_Keys_Control;
+ /** This field is the data destructor. */
+ void (*destructor) (void *);
+ } POSIX_Keys_Control;
/**
- * The following defines the information control block used to manage
- * this class of objects.
+ * @brief The information control block used to manage this class of objects.
*/
POSIX_EXTERN Objects_Information _POSIX_Keys_Information;
/**
- * @brief POSIX keys manager initialization.
+ * @brief The rbtree control block used to manage all key values
+ */
+POSIX_EXTERN RBTree_Control _POSIX_Keys_Rbtree;
I would call this _POSIX_Keys_Key_value_lookup_tree.
[...]
diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c
index 6eace26..71d6a8d 100644
--- a/cpukit/posix/src/key.c
+++ b/cpukit/posix/src/key.c
@@ -6,12 +6,13 @@
*/
/*
- * COPYRIGHT (c) 1989-2008.
- * On-Line Applications Research Corporation (OAR).
+ * Copyright (c) 2012 Zhongwei Yao.
+ * COPYRIGHT (c) 1989-2008.
+ * 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.com/license/LICENSE.
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ *http://www.rtems.com/license/LICENSE.
*/
#if HAVE_CONFIG_H
@@ -29,19 +30,116 @@
#include <rtems/score/thread.h>
#include <rtems/score/wkspace.h>
#include <rtems/posix/key.h>
+#include <rtems/score/rbtree.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/freechain.h>
-/*
- * _POSIX_Key_Manager_initialization
- *
- * DESCRIPTION:
- *
- * This routine performs the initialization necessary for this manager.
+/* forward declarations to avoid warnings */
+void _POSIX_Keys_Keypool_init(void);
+bool _POSIX_Keys_Freechain_extend(Freechain_Control *freechain);
+void _POSIX_Keys_Freechain_init(Freechain_Control *freechain);
Never place declarations of global functions in a source file.
[...]
+ /**
+ * delete all nodes belongs to the_key from the rbtree and chain.
+ */
+ p = _RBTree_Container_of( iter, POSIX_Keys_Rbtree_node, rb_node );
+ while ( p->key == the_key->Object.id ) {
+ next = _RBTree_Next_unprotected( iter, RBT_RIGHT );
+ _RBTree_Extract_unprotected( &_POSIX_Keys_Rbtree, iter );
+ _Chain_Extract_unprotected( &p->ch_node );
+ /* append the node to _POSIX_Keys_Keypool */
+ _Freechain_Put( (Freechain_Control *)&_POSIX_Keys_Keypool,
+ ( void * ) p->fc_node_ptr);
[...]
Please avoid casts like this. Use _Freechain_Put(
&_POSIX_Keys_Keypool.super_fc, ...) instead.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
rtems-devel mailing list
rtems-devel@rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel