<div dir="ltr">Hi, Sebastian, thanks for your helpful review!<br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Aug 1, 2013 at 3:53 PM, Sebastian Huber <span dir="ltr"><<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brains.de</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello Ashi,<br>
<br>
thanks for your update.<br>
<br>
On 2013-07-31 15:03, Ashi wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
diff --git a/cpukit/posix/include/rtems/<u></u>posix/config.h b/cpukit/posix/include/rtems/<u></u>posix/config.h<br>
index 104bd84..2c76cc1 100644<br>
--- a/cpukit/posix/include/rtems/<u></u>posix/config.h<br>
+++ b/cpukit/posix/include/rtems/<u></u>posix/config.h<br>
@@ -51,6 +51,7 @@ typedef struct {<br>
    uint32_t                            maximum_mutexes;<br>
    uint32_t                            maximum_condition_variables;<br>
    uint32_t                            maximum_keys;<br>
+  uint32_t                            maximum_key_pairs;<br>
</blockquote>
<br>
I would call this maximum_key_value_pairs. </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    uint32_t                            maximum_timers;<br>
    uint32_t                            maximum_queued_signals;<br>
    uint32_t                            maximum_message_queues;<br>
diff --git a/cpukit/posix/include/rtems/<u></u>posix/key.h b/cpukit/posix/include/rtems/<u></u>posix/key.h<br>
index 6d2ebff..d2c51bd 100644<br>
--- a/cpukit/posix/include/rtems/<u></u>posix/key.h<br>
+++ b/cpukit/posix/include/rtems/<u></u>posix/key.h<br>
@@ -1,6 +1,6 @@<br>
  /**<br>
   * @file<br>
- *<br>
+ *<br>
   * @brief POSIX Key Private Support<br>
   *<br>
   * This include file contains all the private support information for<br>
@@ -8,24 +8,30 @@<br>
   */<br>
<br>
  /*<br>
- *  COPYRIGHT (c) 1989-2011.<br>
- *  On-Line Applications Research Corporation (OAR).<br>
+ * Copyright (c) 2012 Zhongwei Yao.<br>
+ * COPYRIGHT (c) 1989-2011.<br>
+ * On-Line Applications Research Corporation (OAR).<br>
   *<br>
- *  The license and distribution terms for this file may be<br>
- *  found in the file LICENSE in this distribution or at<br>
- *<a href="http://www.rtems.com/license/LICENSE" target="_blank">http://www.rtems.com/license/<u></u>LICENSE</a>.<br>
+ * The license and distribution terms for this file may be<br>
+ * found in the file LICENSE in this distribution or at<br>
+ *<a href="http://www.rtems.com/license/LICENSE" target="_blank">http://www.rtems.com/license/<u></u>LICENSE</a>.<br>
   */<br>
<br>
  #ifndef _RTEMS_POSIX_KEY_H<br>
  #define _RTEMS_POSIX_KEY_H<br>
<br>
+#include <rtems/score/object.h><br>
+#include <rtems/score/rbtree.h><br>
+#include <rtems/score/chain.h><br>
+#include <rtems/score/chainimpl.h><br>
+#include <rtems/score/freechain.h><br>
  #include <rtems/score/objectimpl.h><br>
</blockquote>
<br>
The xyzimpl.h files include the zyz.h files.  So the object.h and chain.h includes are superfluous.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
  /**<br>
   * @defgroup POSIX_KEY POSIX Key<br>
   *<br>
   * @ingroup POSIXAPI<br>
- *<br>
+ *<br>
   */<br>
  /**@{**/<br>
<br>
@@ -34,40 +40,93 @@ extern "C" {<br>
  #endif<br>
<br>
  /**<br>
- * This is the data Structure used to manage a POSIX key.<br>
- *<br>
- * NOTE: The Values is a table indexed by the index portion of the<br>
- *       ID of the currently executing thread.<br>
+ * Forward declaretion<br>
+ */<br>
+typedef struct POSIX_Keys_Freechain_node_<u></u>struct POSIX_Keys_Freechain_node;<br>
+<br>
+/**<br>
+ * @brief The rbtree node used to manage a POSIX key and value.<br>
+ */<br>
+typedef struct {<br>
+  /** This field is the chain node structure. */<br>
+  Chain_Node ch_node;<br>
+  /** This field is the rbtree node structure. */<br>
+  RBTree_Node rb_node;<br>
</blockquote>
<br>
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.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+  /** This field points to parent freechain node */<br>
+  POSIX_Keys_Freechain_node *fc_node_ptr;<br>
</blockquote>
<br>
I don't think we need this fc_node_ptr.<br></blockquote><div>Do you mean use a 'Container' macro instead? <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+  /** This field is the POSIX key used as an rbtree key */<br>
+  pthread_key_t key;<br>
+  /** This field is the Thread id also used as an rbtree key */<br>
+  Objects_Id thread_id;<br>
+  /** This field points to the POSIX key value of specific thread */<br>
+  void *value;<br>
+}  POSIX_Keys_Rbtree_node;<br>
</blockquote>
<br>
I would call this POSIX_Keys_Key_value_pair.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+/**<br>
+ * @brief POSIX_Keys_Freechain is used in Freechain structure<br>
+ */<br>
+typedef struct {<br>
+    Freechain_Control super_fc;<br>
+    size_t bump_count;<br>
+} POSIX_Keys_Freechain;<br>
+<br>
+/**<br>
+ * @brief POSIX_Keys_Freechain_node is freechain node<br>
+ */<br>
+struct POSIX_Keys_Freechain_node_<u></u>struct {<br>
+  Chain_Node ch_node;<br>
+  POSIX_Keys_Rbtree_node rb_node;<br>
+};<br>
</blockquote>
<br>
Why not use POSIX_Keys_Rbtree_node directly?<br></blockquote><div>Since every freechain node needs a Chain_Node in its first field. There is a Chain_Node in  POSIX_Keys_Rbtree_node, but it is used in each thread's key value chain. So I add a Chain_Node to POSIX_Keys_Rbtree_node. <br>
</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+/**<br>
+ * @brief The data structure used to manage a POSIX key.<br>
   */<br>
  typedef struct {<br>
     /** This field is the Object control structure. */<br>
     Objects_Control     Object;<br>
-   /** This field points to the optional destructor method. */<br>
-   void              (*destructor)( void * );<br>
-   /** This field points to the values per thread. */<br>
-   void              **Values[ OBJECTS_APIS_LAST + 1 ];<br>
-}  POSIX_Keys_Control;<br>
+   /** This field is the data destructor. */<br>
+   void (*destructor) (void *);<br>
+ }  POSIX_Keys_Control;<br>
<br>
  /**<br>
- * The following defines the information control block used to manage<br>
- * this class of objects.<br>
+ * @brief The information control block used to manage this class of objects.<br>
   */<br>
  POSIX_EXTERN Objects_Information  _POSIX_Keys_Information;<br>
<br>
  /**<br>
- * @brief POSIX keys manager initialization.<br>
+ * @brief The rbtree control block used to manage all key values<br>
+ */<br>
+POSIX_EXTERN RBTree_Control _POSIX_Keys_Rbtree;<br>
</blockquote>
<br>
I would call this _POSIX_Keys_Key_value_lookup_<u></u>tree.<br>
<br>
[...]<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c<br>
index 6eace26..71d6a8d 100644<br>
--- a/cpukit/posix/src/key.c<br>
+++ b/cpukit/posix/src/key.c<br>
@@ -6,12 +6,13 @@<br>
   */<br>
<br>
  /*<br>
- *  COPYRIGHT (c) 1989-2008.<br>
- *  On-Line Applications Research Corporation (OAR).<br>
+ * Copyright (c) 2012 Zhongwei Yao.<br>
+ * COPYRIGHT (c) 1989-2008.<br>
+ * On-Line Applications Research Corporation (OAR).<br>
   *<br>
- *  The license and distribution terms for this file may be<br>
- *  found in the file LICENSE in this distribution or at<br>
- *<a href="http://www.rtems.com/license/LICENSE" target="_blank">http://www.rtems.com/license/<u></u>LICENSE</a>.<br>
+ * The license and distribution terms for this file may be<br>
+ * found in the file LICENSE in this distribution or at<br>
+ *<a href="http://www.rtems.com/license/LICENSE" target="_blank">http://www.rtems.com/license/<u></u>LICENSE</a>.<br>
   */<br>
<br>
  #if HAVE_CONFIG_H<br>
@@ -29,19 +30,116 @@<br>
  #include <rtems/score/thread.h><br>
  #include <rtems/score/wkspace.h><br>
  #include <rtems/posix/key.h><br>
+#include <rtems/score/rbtree.h><br>
+#include <rtems/score/chain.h><br>
+#include <rtems/score/freechain.h><br>
<br>
-/*<br>
- *  _POSIX_Key_Manager_<u></u>initialization<br>
- *<br>
- *  DESCRIPTION:<br>
- *<br>
- *  This routine performs the initialization necessary for this manager.<br>
+/* forward declarations to avoid warnings */<br>
+void _POSIX_Keys_Keypool_init(void)<u></u>;<br>
+bool _POSIX_Keys_Freechain_extend(<u></u>Freechain_Control *freechain);<br>
+void _POSIX_Keys_Freechain_init(<u></u>Freechain_Control *freechain);<br>
</blockquote>
<br>
Never place declarations of global functions in a source file.<br>
<br>
[...]<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+  /**<br>
+   * delete all nodes belongs to the_key from the rbtree and chain.<br>
+   */<br>
+  p = _RBTree_Container_of( iter, POSIX_Keys_Rbtree_node, rb_node );<br>
+  while ( p->key == the_key->Object.id ) {<br>
+    next = _RBTree_Next_unprotected( iter, RBT_RIGHT );<br>
+    _RBTree_Extract_unprotected( &_POSIX_Keys_Rbtree, iter );<br>
+    _Chain_Extract_unprotected( &p->ch_node );<br>
+    /* append the node to _POSIX_Keys_Keypool */<br>
+    _Freechain_Put( (Freechain_Control *)&_POSIX_Keys_Keypool,<br>
+                       ( void * ) p->fc_node_ptr);<br>
</blockquote>
[...]<br>
<br>
Please avoid casts like this.  Use _Freechain_Put( &_POSIX_Keys_Keypool.super_fc, ...) instead.<div class=""><div class="h5"><br>
<br>
-- <br>
Sebastian Huber, embedded brains GmbH<br>
<br>
Address : Dornierstr. 4, D-82178 Puchheim, Germany<br>
Phone   : +49 89 189 47 41-16<br>
Fax     : +49 89 189 47 41-09<br>
E-Mail  : <a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-<u></u>brains.de</a><br>
PGP     : Public key available on request.<br>
<br>
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.<br></div></div></blockquote><div><br>Thanks,<br>Zhongwei <br></div></div><br></div></div>